1

我读到不建议依赖乘以布尔(真)值或在计算中使用它。还刚刚注意到在 VB.NET 中 True 是 -1 而不是 1 或任何其他值。

在很多情况下,我想乘以 Boolean True 值并将其视为 1 的整数(或 -1 也可以)。在计算中使用布尔真值的建议方法是什么

4

7 回答 7

4

如果需要根据 的值进行计算Boolean,请使用 C# 中的三元运算符,或IFVB.NET 中的表达式:

Res = SomeValue * If(MyBoolean, 1, 0) + SomeOtherValue

像这样的表达式让读者清楚你的意图,即使在分配布尔特定数值的语言(例如 C 或 C++)中,它也提高了可读性。

于 2013-09-04T19:29:37.707 回答
1

如果您想使用 abool作为值0or 1,分别对应于falsetrue,然后执行以下操作:

bool b = true;
double x = 3.14;
double y = (b ? 1 : 0) * x;
于 2013-09-04T19:28:58.343 回答
1

您可以使用三元运算符,这样您就不必猜测 true 是 1 还是 -1。

int product = someValue * (myBool ? 1 : 0)

这也将允许您将其他值定义为 true 和 false。

于 2013-09-04T19:31:57.333 回答
0

如果您广泛依赖这一点,我建议您在 bool 上放置一个扩展方法,该方法返回您选择的数值 - 基于真/假。

于 2013-09-04T19:27:41.437 回答
0

不知道为什么要使用布尔值进行计算。它们不适用于算术运算。

不知道这是否是最好的方法,但你可以这样做:-

bool b = true;
var x = 0;

if(b == true)
{
  x = -1;  // Use the value of this x anywhere you want provided the scope is clear.
}
于 2013-09-04T19:28:02.020 回答
0

根据具体情况,您可能希望使用IComparerIComparable接口。例如,如果您已经进行了某种排序比较,它会产生一个布尔值,然后您可以对其进行转换和相乘,那么使用其中一个接口并直接与结果相乘可能比执行比较、获取一个布尔值、转换布尔然后相乘。

但是请注意,因为它们都可以根据参数的顺序返回负数。此外,这可能仅在产生的 bool 是排序比较的结果时才有用。

于 2021-01-12T04:10:39.183 回答
0

初步建议:您可以使用该Convert.ToInt32(bool)方法将 bool 转换为 int。

https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?redirectedfrom=MSDN&view=net-5.0#System_Convert_ToInt32_System_Boolean _

新建议:您可以在代码块中使用带有unsafe关键字的 C# 指针(注意,您还必须在构建选项中启用它)。有关更多信息,请参阅:https ://www.c-sharpcorner.com/article/pointers-and-unsafe-code/

代码片段来自:https ://www.c-sharpcorner.com/article/pointers-in-C-Sharp/

unsafe
{
    char c = 'R';  
    char *pc = &c;  
    void *pv = pc; // Implicit conversion  
    int *pi = (int *) pv; // Explicit conversion using casting operator
}

如果你创建一个 int 指针来保存 bool 的地址,你应该能够让程序读取 bool 的内存地址,就好像它是一个 int 一样。所以类似于:

    unsafe class Program
    {
        unsafe static int AddBools(bool* a, bool* b)
        {
            /*casts the bool pointer to a byte pointer and then uses the *
            operator to access the value at the position as a byte, which you can
            use in calculations (both data types are 8-bit)*/ 
            return (*(byte*)a) + (*(byte*)b);
        }

        unsafe static void Main(string[] args)
        {
            bool a = false;
            bool b = true;

            Console.WriteLine("a+a = " + AddBools(&a, &a)); //prints 0
            Console.WriteLine("a+b = " + AddBools(&a, &b)); //prints 1
            Console.WriteLine("b+b = " + AddBools(&b, &b)); //prints 2

            Console.ReadKey();
        }
    }

请记住有符号/无符号和整数/浮点类型之间的位编号差异。以下是位编号的 wiki 页面链接以及 C# 中不同数据类型及其大小的列表: https://en.m.wikipedia.org/wiki/Bit_numbering https://www.tutorialsteacher.com/csharp /csharp 数据类型

于 2020-11-18T16:17:43.023 回答