C#中布尔逻辑
C#中,bool类型可以有两个值:true或false。这种类型常常用于记录某些操作的结果,当然也用作存储比较结果,用以判断。
布尔逻辑在其他语言中也非常常见,用法也很简单,但也有一些需要注意的地方,一边学一边做些笔记吧。
-
有时候无意间假设
val1 < val2
是false,而认为val1 > val2
便是true,需要注意,还有val1 == val2
这个情况。 -
使用
&&
和||
运算符来代替&
和|
,性能会有一定提高,在大量使用这些运算符的应用程序中表现尤为明显。例如说,&&
运算符的第一个操作数是false
,则不需要考虑第二个操作数了,因为无论第二个操作数的值是什么,其结果都是false
。
另外,还有一个非常有用的例子:
var1 = (var2 != 0) && (var3 / var2 > 2);
在上面的例子中,如果var2
是0,则var3 / var2
就会导致“除0错误”,或者把var1
定义为无穷大。而通过&&
先判断var2
的值就可以规避这种不经意的错误。
&
、|
和^
运算符还有一个有趣的作用:对数值执行按位操作,它们处理的是变量中存储的一系列位,而不是改变变量值。
例如,考虑以下代码的操作:
int result, op1, op2;
op1 = 4, op2 = 5;
result = op1 & op2;
这里就需要考虑op1
和op2
的二进制表示,它们分别是100
和101
。
按位对比后,二进制结果为100
,即op1 & op2
结果是4。
- C#中还可以使用一元运算符
~
,它将操作数中的位取反。但需要注意的是整数在.NET
中存储的方式称为2的补位,按照2的补位系统,(-x)
定义为(~x + 1)
。例如,把10和-5相加(即10-5),用32位int
表示为:
忽略最左端的1,就得到10-5
的二进制表示,即十进制5。类似地~1 = 2
这样比较奇怪的结果就是因为底层的结构强制生成了这个结果。
- 除了上面介绍的
&
、|
、^
和~
外,还有两个移位运算符:>>
和<<
。比如说下面这个例子:
int var1, var2 = 10, var3 = 2;
var1 = var2 << var3;
最终var1
的值是40。具体执行过程如下:var2
的二进制值是1010
,把该二进制值向左移位两位(var3
),得到101000
,即十进制中的40。实际上,是执行了乘法操作,每向左移动一位,该数都要乘以2。
类似地,每向右移动一位,则将操作数除以2,并丢弃非整数余数:
int var1, var2 = 10, var3;
var1 = var2 >> 1;
var3 = var2 >> 2;
上面示例中,var1
的值是5,而var3
的值是2。
- 按位移位运算符主要用于高度优化的代码,通常用于设备驱动程序或是系统代码。
Comments