至于为什么会有&和|运算符。是因为这两个运算符可以用于对数值执行操作。实际上,它们处理的是存储在变量中的一系列位,而不是变量的值。
下面先讨论&,第一个操作数中的每个位都与第二个操作数相同位置上的位进行比较,在得到结果中,各个位置上的位如下所示:
操作数1的位:1100
操作数2的位:1010
&的结果位: 1000
|运算符与此类似,但得到的结果是不同的,如下所示:
操作数1的位:1100
操作数2的位:1010
&的结果位: 1110
例如,考虑下面代码中的操作:
int result,op1,op2;
op1 = 4;
op2 = 5;
result = op1 & op2;
这里必须考虑op1和op2的二进制表示方式,它们分别是100和101。比较这两个表达方式中相同位置上的二进制数字,得出结果,如下所示:
*如果op1和op2最左边的位都是1,result最左边的位就是1,否则为0。
*如果op1和op2次左边的位都是1,result次左边的位就是1,否则为0。
*继续比较其他位。
在这个示例中,op1和op2最左边的位都是1,所以result最左边的位就是1。下一个位都是0,第三个位置上的位分别是1和0,则result第2~3个位都是0。最后,结果的二进制值是100,即结果是4。以下是这个过程:
&:100 &4
101 &5
100 &4
如果使用|运算符,将进行相同的过程,但如果操作数中相同位置上的位有一个是1,其结果位就是1,如下所示:
|:100 |4
101 |5
101 |5
^运算符的用法与此相同。如果操作数中相同位置上的位有且只有一个是1,其结果为就是1,如下所示:
操作数1的位:1100
操作数2的位:1010
^的结果位: 0110
C#中还可以使用一元位运算符~,它将操作数中的位取反,其结果是操作数中位为1的,在结果中就是0,反之亦然:
操作数的位:10
~的结果位:01
除了这4个位运算符外,还有另外两个运算符,如下所示:
>>:var1 = var2>>3 把var2的二进制值向右移动var3位,就得到var1的值。
<<:var1 = var2<<3 把var2的二进制值向左移动var3位,就得到var1的值。
这些运算符通常称为位移运算符,最好举例说明:
int var1,var2 = 10,var3 = 2;
var1 = var2 << var3;
结果,var1的值是40。具体过程如下:10的二进制是1010,把该数向左移动两位,得到101000,即十进制中的40。实际上,是执行了多个操作。每向左移动一位,该数都要乘以2,所以向左移动两位,就是给原来的操作数乘以4。而每向右移动一位,则是给操作数除以2并丢弃余数。
int var1,var2 = 10;
var1 = var2 >> 1;
var1的值是5,下下面的代码得到的值是2:
int var1,var2 = 10;
var1 = var2 >> 2;