js 位运算
一、计算机基础知识
1.二进制的正负数表示。这里我们以11为例。
+11: 1011(+11的补码,并不是在计算机中的完整存储结构);
-11: 0101(-11的补码,并不是在计算机中的完整存储结构)
有符号数即正负数在计算机是以补码形式存储的。
2.符号位即为第一位,1为负,0为正。
二、位运算
1、位与 &(每个位上都是1结果才是1)
![]()
9 & 3 = 1
// 判断奇偶 return number & 1 === 1
我们知道奇数的二进制最后一位必然为1,所以任意一个奇数 & 1 一定等于1。
2.位或 | (每个位上假假为假,其余为真)
整数与0的位或运算,都是本身。浮点数不支持位运算,过程中会自动转化成整数,利用这一点,可以将浮点数与0进行位或运算即可达到取整目的。
console.log(15.22 | 0); // 15
3. 异或^ ( 每位上相同为假,不同为真)
4.有符号左移 <<
首位符号为不动,把32位二进制数字整体往左边移动指定位数,左边超出部分被舍去,右边补0
9二进制有符号左移5位
9<<5
0000000000000000 0000000000001001
------
0000000000000000 0000000100100000
5.有符号右移 <<
首位符号为不动,把32位二进制数字整体往右边移动指定位数,右边超出部分被舍去,左边补0。
288二进制有符号右移5位
9>>5
0000000000000000 0000000100100000
------
0000000000000000 0000000000001001
6.无符号右移(>>>)
符号位也跟着一起移动,这样,无符号右移会把负数的二进制当成整数的二进制码
4294967296二进制无有符号右移5位
4294967296>>>5
1000000000000000 0000000000000000
------
0000010000000000 0000000000000000
7.位非(~)
9二进制位非运算
~ 0000000000000000 0000000000001001
-------取反
1111111111111111 1111111111110110
-------符号位不变,其余取反
1000000000000000 0000000000001001
-------加1
1000000000000000 0000000000001010
按位非操作,首先每一位取反,然后,第一位为负数符号位保持不变,剩余取反加1就是最后结果。
三、面试题
var a = 10; a ^= (1<<4) - 1; 1<<4左移4位,即1*Math.pow(2, 4) == 16,则a ^= 15 10和15的异或运算 1111 ^ 1010 ......... 0101 0101二进制表示5,所以a的值5
2.给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
示例 1:
输入: 5
输出: 2
解释: 5 的⼆进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。
示例 2:
输入: 1
输出: 0
解释: 1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
注意:
给定的整数保证在 32 位带符号整数的范围内。 你可以假定二进制数不包含前导零位。
function(num){
let t,res;
if (num == 0){
return 1
}
t = num
res = 0
while t > 0:
t = t >> 1
res = res << 1
res += 1
return res ^ num
}

浙公网安备 33010602011771号