建议只对无符号数做位运算。有符号数会有出错的可能。
移位
左移相当于乘以2,右移相当于除以2。
与运算(&) 可以取出某些位的值。 0x12345678 & 0x000000ff = 0x00000078 可以将某些位清零。0x12345678 & 0xffff00ff = 0x12340078
或运算 (|)将某些位至1. 0x12345678 | 0x0000ff00 = 1234ff78
循环右移: (a<<(N-n)) | a>>n
循环左移:(a>>(N-n) ) | a<<n
异或 运算 :
与0异或 保持原值不变, 与1异或得到原值的反。
自己与自己异或 得到0 ; (汇编语言里面可以用到,将寄存器至0. 位运算比生成一个0在赋值 更快!)
可以用来奇偶校验。
可以用来 交换。如
a= a^ b ;
b= b^ a;
a = a ^b;
这个比取一个中间值swap 做交换要简洁的多。(但这种写法的代码效率其实比swap 要低得多)
PS: 另一个不借助swap 做交换的例子:
a=a*b;
b=a/b;
a=a/b; 其中b 不能为0