位运算符是指它们对每位进行操作,而不影响左右两侧的位。注意请勿将位运算符和逻辑运算符(&&、||、!)相混淆,常规的逻辑运算对整个值进行操作。
位运算符有:~(取反)、&(位与)、|(位或)、^(位异或)
1)二进制反码或按位取反:~
一元运算符~将每个1变为0,每个0变为1.
例如:
~(10011011) // 表达式
(01100100) // 结果值
2)位与(AND):&
二进制位运算符&通过对两个逐位进行比较相与产生一个新值。对于每个位,只有两个操作数的对应位都为1时结果才为1。
例如:
(11000101)&(01101110) //表达式
(01000010) //结果值
3)位或(OR):|
二进制运算符 | 通过对两个操作数逐位相或产生一个新值。对于每个位,如果其中任意操作数中对应的位为1,那么结果为就为1。
例如:
(00110001)|(01011101) // 表达式
(01111101) //结果值
4)位异或:^
二进制运算符^对两个操作数逐位相异或。对于每个位,如果操作数的对应位只有一个为1,那么结果为1。
例如:
(00110101)^(11010111) //表达式
(1110010) // 结果值
位运算符还可以与赋值运算符组合:&=、|=、~=、^=
例如:
new&=(0314) // 等价于
new=new&(0314)
掩码:是某些位设为开(1)而某些位设置为关(0)的位组合。
使用&将一个数值与掩码相组合时,例如:定义符号常量MASK为2,即二进制为00000010,只有位1是非零。那么:
flags=flags&MASK;
这个语句将导致flags的除位1之外所有位都被为0,原因是它的任何位使用&运算符与0组合都得0;
位1将保持不变。
移位运算符:<<(左移)、>>(右移)
1)左移:<<
左移运算符<<将它左移操作数的值的每位向左移动,移动的位数将由它右侧操作数决定。空出的位有0填充,并且丢弃移出左侧操作数末端的位。
例如:
(10001010)<<2; //表达式
(00101000) //结果值
2)右移:>>
右移运算符>>将它左侧的操作数的每位向右移动,移动的位数由它右侧的操作数决定。丢弃移出>>左侧操作数右端的位。对于无符号类型,使用0填充左端空出的位。对于有符号类型,结果依赖于机器。空出的位有可能是用0填充,或者是使用符号位(最左端的)副本填充。
例如:
(10001010)>>2 //表达式,有符号值
(00100010) //在某些系统上的值
(10001010)>>2 //表达式,有符号值
(11100010) //在另一些系统上的值
(10001010)>> //表达式,无符号值
(00100010) // 所有系统上的值
移位运算符对2的幂的乘法和除法:
number<<n; //number乘以2的n次幂
number>>n; //如果number非负,则用number除以2的n次幂