Appearance
1. 位运算概述 
现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。 例如:
c#
int a = 35;
int b = 47;
int c = a + b;以二进制运算为:
35:  0 0 1 0 0 0 1 1
47:  0 0 1 0 1 1 1 1
————————————————————
82:  0 1 0 1 0 0 1 02. 位运算概览 
| 符号 | 描述 | 运算规则 | 
|---|---|---|
| & | 与 | 两个位都为1时,结果才为1 | 
| | | 或 | 两个位都为0时,结果才为0 | 
| ^ | 异或 | 两个位相同为0,相异为1 | 
| ~ | 取反 | 0变1,1变0 | 
| << | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 | 
| >> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,\n有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) | 
3. 运算符用途 
&:
- 清零。 与一个各位都为零的数值相与,结果为零
 - 取一个数的指定位。 比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
 - 判断奇偶。 根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
 
|:
- 运算规则: 0|0=0 0|1=1 1|0=1 1|1=1
 - 常用来对一个数据的某些位设置为1,比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。
 
^:
- 运算规则: 0^0=0 0^1=1 1^0=1 1^1=0
 - 异或的几条性质: 
- 交换律
 - 结合律 (a^b)^c == a^(b^c)
 - 对于任何数x,都有 x^x=0,x^0=x
 - 自反性: a^b^b=a^0=a;
 
 - 翻转指定位。 比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
 - 与0相异或值不变。
 
~:
- 运算规则: ~1=0 ~0=1
 - 使一个数的最低位为零。使a的最低位为0,可以表示为:a & ~1。
 
<<: 将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
>>: 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。 操作数每右移一位,相当于该数除以2。
复合运算:
| &= | a&=b 即 a=a&b | 
| |= | a|=b 即 a=a|b | 
| >>= | a>>=b 即 a=a>>b | 
| <<= | a<<=b 即 a=a<<b | 
| ^= | a^=b 即 a=a^b | 
不同长度的数据进行位运算:如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。 以"与运算"为例说明如下:我们知道在C语言中long型占4个字节,int型占2个字节,如果一个long型数据与一个int型数据进行"与运算",右端对齐后,左边不足的位依下面三种情况补足,
- 如果整型数据为正数,左边补16个0。
 - 如果整型数据为负数,左边补16个1。
 - 如果整形数据为无符号数,左边也补16个0。