在.NET中经有时会碰到一些类似于&,|,!,^,<<,>>的运算符,这些运算符到底是啥作用呢。
& 与 如果两个都为
1,则结果为
1,否则结果为
0
例:
10001010 &
00101011 结果为
00001010
| 或 如果两个中有一个为
1,那么结果为
1,两个都为
0的时候结果为
0
例:
10001010 |
00101011 结果为
10101011
!取反 取反码(最高位是符号位)
例:!
10001010 结果为
11110101
^ 异或 如果两者相同就为
0,否则就为
1
例:
10001010 ^
00101011 结果为
10100001
~ 取补 取补码 (最高位是符号位)
例:~
10001010 结果为
11110110
<< 左移 将操作数按位左移高位被丢弃低位顺序补
0
例:
10001010 <<
4 也就是左移
4位 结果为
10100000
注意:对于有符号的数,左移会丢弃符号位,或者符号位会被更改。
<< 右移 将操作数按位右移低位被丢弃,如果是正数高位顺序补
0,如果是负数高位顺序补
1
例:
10001010 >>
4 也就是右移
4位 结果为
11111000
注意:对于有符号的数(
int,
double)等,右移时,最高位的符号位应该不变,如果以前是正数,符号位是
0,那么右移后还应该是
0,其他位补
0,
如果以前是负数,符号位是
1,那么右移后,符号位还应该是
1,其他数补
1(因为负数存的补码).对于无符号的数(
uint,
ushort)等,那不需要关心符号位。
特别注意:
对于
char,
byte,
sbyte,
short等类型进行运算时,编译器默认会把它们转换成
int类型(原因可能是对于
char,
byte来说,进行运算很容易发生溢出),所以在移动的时候,最大只能移动
32个位(因为
int类型占
32位),也就是说右边右移的数,只有前面
5位有效,后面被舍弃了。比如右移
33位,取
33的二进制字符串的低
5位,也就是十进制的
1,也不是说右移
33位相当于右移
1位。同理左移也是这样的。
有时对
byte类型进行移位操作,当你左移
9位,或者
10位的时候,你会发现一直是
0,原因也跟上面的一样,对
byte移位的时候,是把它转换成
int的,而你把
int移动
9位或者
10位是可以的,但是你返回结果是
byte类型,所以它只会取低
8位,而低
8位都是
0,所以你看到的是
0,如果想看到真实的值,可以返回
int类型,这时候就可以看到左移
9位或者
10位的效果。