位运算

建议只对无符号数做位运算。有符号数会有出错的可能。

 

移位

左移相当于乘以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

   

原文地址:https://www.cnblogs.com/yestreen/p/3051282.html