总结 ^
: 两位相同为0,两位不同为1&
: 两位全为1则为1,否则为0|
: 两位中有一位有1则为1,否则为0>>
: 右移操作相当于除2<<
: 左移操作相当于乘2
十进制小数转换为二进制小数规定 1 2 3 4 5 6 ## 整数部分: 除2取余,逆序排列 ## 小数部分: 乘2取整,顺序排列 例子: 173.8125 173 => 101011101 0.8125 => 0.1101 0.8125 * 2 = 1.6250(取1) => 0.625 * 2 => 1.2500(取1) => 0.25 * 2 => 0.5(取0) => 0.5 * 2 = 1.0(取1)
负数的二进制表示方法 1 2 3 4 5 6 负数以源码的补码表示 负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1 例:-10 => 10000000 00000000 00000000 00001010 -10的源码 => 11111111 11111111 11111111 11110101 -10的反码 => 11111111 11111111 11111111 11110110 -10的反码加一
左移和右移运算 (>>, <<) 1 2 3 4 5 // 二进制的左移: m左移n位,最左边的n位被丢弃,右边补上n个0 // 二进制的右移:m右移n位,最右边的n位被丢弃, // 如果数字是一个无符号数值,则用0填补最左边的n位,如果是负数,最左边补n个1 00001010 >> 2 => 00000010 10001010 >> 3 => 11110001
异或运算符(^)的操作
无符号右移运算符(>>>) 1 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃
js中操作符的妙用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1. 使用&运算符判断一个数的奇偶 例子: 2 & 1 // 0 2. 使用~, >>, <<, >>>, |来取整 例子: 6.83 >> 0 // 6 3. 使用^来完成值交换 例子: var a = 5 var b = 8 a ^= b b ^= a a ^= b console.log(a) // 8 console.log(b) // 5 4. 使用&, >>, | 来完成rgb值和16进制颜色值之间的转换 ''' #ffffff rgb(255, 255, 255) 8位表示一个色度 function hexToRGB(hex) { var hexx = hex.replace('#', '0x') var r = hexx >> 16 var g = hexx >> 8 & 0xff // 去掉r 00 00 ff ff & 00 00 00 ff var b = hexx & 0xff // 去掉r, g // 00 ff ff ff ff & 00 00 00 ff return `rgb(${r}, ${g}, ${b})` } function RGBToHex(rgb) { var rgbArr = rgb.split(/[^\d]+/) var color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3] return '#'+ color.toString(16) } ''' 5: (A|B|C|D) & D = D, 这个可以检测一个集合中是否有该值存在。
常见的算法题 汉明距离 题目来源
思路: xor操作后,右移记录1的个数,右移为0就结束了循环
1 2 3 4 5 6 7 8 const hammingDistance = (x, y ) => { let xor = x ^ y, count = 0 while (xor) { if (xor & 1 ) count++ xor >>= 1 } return count }
比特位计数 题目来源
思路: 奇数最后一位为1,偶数最后一位为0. 所以偶数的右移1位,1的个数不变。 奇数右移1位,1个个数减一。 因此得出: 如果 xx 是偶数,bit[x] = bit[x / 2] 如果 xx 是奇数,bit[x] = bit[x / 2] + 1 => bix[x] = bit[x >> 1] + (x & 1)
1 2 3 4 5 6 7 const countBits = num => { const result = new Array (num + 1 ).fill(0 ) for (let i = 0 ; i <= num; i++) { result[i] = result[i >> 1 ] + (i & 1 ) } return result }
只出现一次的数字 题目来源
思路: 因为其他的元素都出现过两次,那么两个相同元素进行异或就是0 然后0 ^ 只出现一次的数字值不会变: 0000000 ^ 0110101 = 0110101
1 2 3 4 const singleNumber = nums => { return nums.reduce((acc, num ) => acc ^= num, 0 ) }