在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。
C# 中支持的位操作符号有:
运算符号
|
意义
|
运算对象类型
|
运算结果类型
|
对象数
|
实例
|
~
|
按位取反运算
|
整型,字符型
|
整型
|
1
|
~a
|
&
|
位逻辑
与运算
|
2
|
a & b
| ||
|
|
位逻辑
或运算
|
2
|
a | b
| ||
^
|
位逻辑
异或运算
|
2
|
a ^ b
| ||
<<
|
位
左移运算
|
2
|
a<<4
| ||
>>
|
位
右移运算
|
2
|
a>>2
|
下面详细介绍每个位运算的操作。
1. 按位取反操作 ~
按位取反操作会将整个变量的所有位都进行取反,包括符号位。
class Program
{
static void Main(string[] args)
{
int number = 5;
number = ~number;
Console.WriteLine(number);
int k = -5;
number = ~k;
Console.WriteLine(number);
}
}
输出为:
-6
4
举例: 在C#中int 类型占4个字节, 5 的二进制码为:
0000 0000 0000 0000 0000 0000 0000 0101
按位取反后的二进制码为:
1111 1111 1111 1111 1111 1111 1111 1010
这个二进制码对应内存中存储的补码,让这个二进制码减去1,得到表示数字的反码:
1111 1111 1111 1111 1111 1111 1111 1001
由这个反码即可获得源码,请注意,最左边的为符号位,在活的原码的时候符号位不取反:
1000 0000 0000 0000 0000 0000 0000 0110
这个数在内存中即为 -6。
同样,-5在内存中的原码为:
1000 0000 0000 0000 0000 0000 0000 0101
获得反反码为:
1111 1111 1111 1111 1111 1111 1111 1010
补码为:
1111 1111 1111 1111 1111 1111 1111 1011
这个补码按位取反以后为:
0000 0000 0000 0000 0000 0000 0000 0100
在内存中即为 4.
2、位逻辑与运算 &
注意:符号位同样参加按位与操作。
位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。
比如:10010001(二进制)&11110000等于10010000(二进制)。
class Program
{
static void Main(string[] args)
{
int a = 1;
int b = 2;
int c = a & b;
Console.WriteLine(c);
}
}
a 为:
0000 0000 0000 0000 0000 0000 0000 0001
b 为:
0000 0000 0000 0000 0000 0000 0000 0010
按位与以后为:
0000 0000 0000 0000 0000 0000 0000 0000
下面举例当符号位参与操作的情况:
static void Main(string[] args)
{
int a = -2147483647;
int b = 1;
int c = a & b;
Console.WriteLine(c);
}
a:
1000 0000 0000 0000 0000 0000 0000 0001
a的原码为:
1111 1111 1111 1111 1111 1111 1111 1111
b的二进制:0000 0000 0000 0000 0000 0000 0000 0001
按位与以后还是:0000 0000 0000 0000 0000 0000 0000 0001
3、位逻辑或运算 |同上,同样包含符号位操作。
位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,0或0等于0。比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。class Program { static void Main(string[] args) { int a = 1; int b = 2; int c = a | b; Console.WriteLine(c); } }
a 为:
0000 0000 0000 0000 0000 0000 0000 0001
b 为:0000 0000 0000 0000 0000 0000 0000 0010
按位与以后为:0000 0000 0000 0000 0000 0000 0000 0000
a 为:
0000 0000 0000 0000 0000 0000 0000 0001
b 为:0000 0000 0000 0000 0000 0000 0000 0010
按位或以后为:0000 0000 0000 0000 0000 0000 0000 0011
4、位逻辑异或运算 ^
同上,同样包含符号位操作。
位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,1异或0等于1,0异或0等于0。即:相同得0,相异得1。比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。
5、位左移运算 <<
同上,同样包含符号位操作。
位左移运算将整个数按位左移若干位,左移后空出的部分0。比如:8位的byte型变量byte a=0x65(即二进制的01100101),将其左移3位:a<<3的结果是0x27(即二进制的00101000)。static void Main(string[] args) { int a = -2147483647; a = a << 2; Console.WriteLine(a); }
a 的二进制:左移两位以后,符号位丢失:0000 0000 0000 0000 0000 0000 0000 0100
即为4.0000 0000 0000 0000 0000 0000 0000 0100
6、位右移运算 >>
同上,同样包含符号位操作。
位右移运算将整个数按位右移若干位,右移后空出的部分填0。比如:8位的byte型变量Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。