位运算
各个位运算概览
- &(与): 两个位都为1时,结果才为1
- |(或): 两个位都为0时,结果才为0
- ^(异或): 两个位相同时为0,相异为1
- ~(取反): 0变1,1变0
- <<(左移): 各二进位全部左移若干位,高位丢弃,低位补0
- '>>'(右移): 各二进位全部右移若干位,对无符号数高位补0,有符号数各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
与运算特性
例如: 3&5 即 00000011 & 00000101 = 00000001
因此 3&5 的值得1
用途:
- 清零: 想将一个单元清零,将其与0与运算结果会为0
- 取一个数的指定位: 比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y=00001111,然后将X与Y进行按位与运算(X&Y=00001110)即可得到X的指定位
- 判断奇偶: 只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数,因此可以用
if ((a & 1) == 0)
代替if (a % 2 == 0)
来判断a是不是偶数
或运算特性
例如: 3|5即 00000011 | 00000101 = 00000111
因此 3|5 的值得7
用途:
- 将一个数的指定位设为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 // 运算
用途:
- 翻转指定位: 比如将数 X=10101110 的低4位进行翻转,只需要另找一个数Y,令Y=00001111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到
- 交换两个数
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