cqc3073
3/5/2018 - 9:00 AM

位运算技巧

位运算技巧

位运算技巧

按位与

运算规则

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

使用技巧

  • 0与任何(也就0或1)'被与数'都得0
  • 1与任何'被与数'都得'被与数'自身

使用案例

  • 将第5个标志位设置为0(不论第5位是否为0):0x10111100 & 0x11101111 = 0x10101100
  • 将所有标志位清0:0x11111111 & 0 = 0

按位或

运算规则

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

使用技巧

  • 0与任何(也就0或1)'被或数'都得'被或数'自身
  • 1与任何'被或数'都得1

使用案例

  • 将第5个标志位设置为1(不论第5位是否为1):0x01000011 & 0x00010000 = 0x01010011
  • 判断奇偶:n&1=0为偶数,否则奇数

按位异或

运算规则

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

使用技巧

  • 0与任何(也就0或1)'被异或数'都得'被异或数'自身
  • 1与任何'被异或数'都得'被异或数'反数(这里说明下反数的定义:1的反数是0,0的反数是1)
  • 任何数与0异或都得数本身 n^0=n
  • 任何数与自身异或都得0。n^n=0

使用案例

  • 两数字交换:a^=b,b^=a,a^=b
  • 计算绝对值:int j = n >> 31, (n ^ j) - j
  • 与-1异或相当于取反。n^-1=~n