Skip to content
On this page

位运算

各个位运算概览

  • &(与): 两个位都为1时,结果才为1
  • |(或): 两个位都为0时,结果才为0
  • ^(异或): 两个位相同时为0,相异为1
  • ~(取反): 0变1,1变0
  • <<(左移): 各二进位全部左移若干位,高位丢弃,低位补0
  • '>>'(右移): 各二进位全部右移若干位,对无符号数高位补0,有符号数各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

与运算特性

例如: 3&5 即 00000011 & 00000101 = 00000001 因此 3&5 的值得1

用途:

  1. 清零: 想将一个单元清零,将其与0与运算结果会为0
  2. 取一个数的指定位: 比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y=00001111,然后将X与Y进行按位与运算(X&Y=00001110)即可得到X的指定位
  3. 判断奇偶: 只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数,因此可以用 if ((a & 1) == 0) 代替 if (a % 2 == 0) 来判断a是不是偶数

或运算特性

例如: 3|5即 00000011 | 00000101 = 00000111 因此 3|5 的值得7

用途:

  1. 将一个数的指定位设为1: 比如将数 X=10101110 的低4位设置为1,只需要另找一个数Y,令Y=00001111,然后将X与Y进行按位或运算(X|Y=10101111)即可得到

异或运算特性

例如: 0^0=0 0^1=1 1^0=1 1^1=0

js
a^a=0 // 自己和自己异或等于0
a^0=a // 任何数字和0异或还等于他自己
a^b^c=a^c^b // 异或运算具有交换律
a^b^a = b^0 = b // 运算

用途:

  1. 翻转指定位: 比如将数 X=10101110 的低4位进行翻转,只需要另找一个数Y,令Y=00001111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到
  2. 交换两个数
js
if (a != b){
  a ^= b;
  b ^= a;
  a ^= b;
}

比如:
a = 110
b = 011

a = 110 ^ 011 = 101
b = 011 ^ 101 = 110
a = 101 ^ 110 = 011

例如数组 a=[1,1,2,3,2],利用异或可以找出那个唯一单个的值

js
let x = 0
for (let index = 0; index < nums.length; index++) {
  x ^= nums[index]
}
return x