位运算都是按照二进制数进行运算
按位与运算
**运算规则:**只有两个数的二进制数同时为1,结果为1,否则为0.(负数以补码的形式参加按位于运算)
即0&0=0,0&1=0,1&0=0,1&1=1
特殊用途:
(1)清零:如果想将一个单元清零,只要与一个二进制都为0的数,结果就都为0
(2)取一个数的指定位:要一个数使其相应位为1,其余位为0,两个数相与即可。
例:设X=10101110,
取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;
按位或运算
**运算规则:**只要两个数的二进制数有一个为1,那么结果就为1.
即0|0=0,0|1=1,1|0=1,1|1=1.
**特殊用途:**常用来对数的某些位置变成1
方法:找到一个数使其需要变的位置为1,不需要变的位置为0,即可
异或运算
**运算规则:**两个数的二进制数的相应位置不相同,那么结果为1,否则为0.
即 0^ 0=0,0^ 1=1,1^ 0=1,1^ 1=0.
注:
(1)交换律:a^b =b^a
(2) 结合律:a^ b^c=a ^(b ^c)=(a ^b) ^ c
(3) 自反律:a^b ^b=a ^0=a
x ^x=0,x ^0=x
特殊用途:(1)使特定位翻转:找一个x对应位为1,其余位为0,两个数异或即可
例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。
(2)与0异或,保持原值
(3) 如果a^b=c,那么c ^b=a,c ^a=b.
(4) 交换两个数的值,且不需中间变量,无溢出风险,
a=a^b
b=b^a
a=a^b
取反运算符(~)
参加运算的数的二进制的对位进行取反
运算规则:~1=0,~0=1.
特殊用途:
使一个数的最低位为零,可以表示为:a&~1。
~ 1的值为1111111111111110,再按“与”运算,最低位一定为0。因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
左移运算符(<<)
将一个数的二进制数全部左移(左边的二进制数丢弃,右边的二进制数补0)
a<<1== (a*=2)
右移运算符(>>)
将一个数的二进制数全部右移,正数左补0,负数左补1,右边丢弃
左补0 or 补1 得看被移数是正还是负。
复合运算符
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:
&= 例: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
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。