携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
位运算
在计算机内存中,都是以二进制形式来存储和计算的,不管我们程序中用的是十进制、十六进制或八进制,都会转换成二进制。这里说的位运算,也是对二进制进行操作的。
常用操作
与(&)
只有当两个位都为1时,才为1
或(|)
两个位只要存在一个为1,结果就是1
异或(^)
两个位相同为0,不同则为1。
非(~)
取反:0变1,1变0
左移(<<)
各二进制全部左移若干位,高位舍弃,低位补0
右移(>>)
各二进制全部右移若干位,如果是正数,头部全部补0;如果是负数,头部全部补1
头部补零的右移(>>>)
就是不管是正数还是负数,右移若干位后,头部统一补零。这样对正数没有影响,和正常右移操作结果一致;但对于负数操作后都会变成正数。
常用固定结构
任何二进制数与0异或操作都不会变化
x ^ 0 === x
异或是相同为0,不同为1。与0异或如果x某一位是0,异或0,结果还是0;如果是1,异或0,不同还是为1。所以与0异或操作结果都是自己。
任何相同二进制数间异或都为0
x ^ x === 0
这个应该很好理解。异或位相同为0,两个x肯定都是相同,所以结果都为0
三个二进制数,如果其中两个数异或等于第三个数,则任意两者异或都等于第三个数
a ^ b === c => a ^ c === b, b ^ c === a
一个二进制数最小单位就是1位,只要我们能证明每一位符合,则不管多少位,结果也是一样的。
1 ^ 1 === 0
1 ^ 0 === 1
判断奇偶
X & 1 === 1 // X为奇数
X & 1 === 0 // X为偶数
这个有点意思,从本质上来说,这样写比十进制求余更高效。
很好理解,与1如果等于1,则x必须末尾是1,为奇数;与1等于0,则末位数是0,X为偶数。