我读到不建议依赖乘以布尔(真)值或在计算中使用它。还刚刚注意到在 VB.NET 中 True 是 -1 而不是 1 或任何其他值。
在很多情况下,我想乘以 Boolean True 值并将其视为 1 的整数(或 -1 也可以)。在计算中使用布尔真值的建议方法是什么。
我读到不建议依赖乘以布尔(真)值或在计算中使用它。还刚刚注意到在 VB.NET 中 True 是 -1 而不是 1 或任何其他值。
在很多情况下,我想乘以 Boolean True 值并将其视为 1 的整数(或 -1 也可以)。在计算中使用布尔真值的建议方法是什么。
如果需要根据 的值进行计算Boolean
,请使用 C# 中的三元运算符,或IF
VB.NET 中的表达式:
Res = SomeValue * If(MyBoolean, 1, 0) + SomeOtherValue
像这样的表达式让读者清楚你的意图,即使在分配布尔特定数值的语言(例如 C 或 C++)中,它也提高了可读性。
如果您想使用 abool
作为值0
or 1
,分别对应于false
和true
,然后执行以下操作:
bool b = true;
double x = 3.14;
double y = (b ? 1 : 0) * x;
您可以使用三元运算符,这样您就不必猜测 true 是 1 还是 -1。
int product = someValue * (myBool ? 1 : 0)
这也将允许您将其他值定义为 true 和 false。
如果您广泛依赖这一点,我建议您在 bool 上放置一个扩展方法,该方法返回您选择的数值 - 基于真/假。
不知道为什么要使用布尔值进行计算。它们不适用于算术运算。
不知道这是否是最好的方法,但你可以这样做:-
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.
}
根据具体情况,您可能希望使用IComparer或IComparable接口。例如,如果您已经进行了某种排序比较,它会产生一个布尔值,然后您可以对其进行转换和相乘,那么使用其中一个接口并直接与结果相乘可能比执行比较、获取一个布尔值、转换布尔然后相乘。
但是请注意,因为它们都可以根据参数的顺序返回负数。此外,这可能仅在产生的 bool 是排序比较的结果时才有用。
初步建议:您可以使用该Convert.ToInt32(bool)
方法将 bool 转换为 int。
新建议:您可以在代码块中使用带有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 数据类型