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
}

  

posted on 2021-03-16 17:35  代码老丸子  阅读(836)  评论(0)    收藏  举报

导航