JS位运算

文章目录

  • 简介
  • `&`
    • 例子
  • `|`
    • 例子
  • `~`
    • 负数的存储方式
      • 真码
      • 反码
      • 补码
    • 取反
    • 便捷操作
      • 快速取整
  • 异或运算
    • 例子
  • 移位
    • 左移`<<`
    • 例子
      • 规律
      • 负数
    • 右移`>>`
      • 例子
        • 规律
    • 全右位移
      • 例子

专栏目录请点击

简介

  • 计算机对于二进制数据的运算就叫做为运算,即将一个整数的二进制格式进行运算,先转化为二进制数,然后进行运算
  • 十进制转化为二进制工具 点击

&

  • 写法为表达式1 & 表达式2
  • 参加运算的两个数据,按二进制位进行“与”运算
  • 两位同时为“1”,结果才为“1”,否则为0,就是将两个整数的每一个二进制位进行比较,如果都为1,结果才为1,其余情况全部为0;

例子

  • 1 & 2
  • 1 对应的二进制是–0000 0000 0000 0000 0000 0000 0000 0001
  • 2 对应的二进制是–0000 0000 0000 0000 0000 0000 0000 0010

进行运算

由于前28位都为0,结果与运算后肯定也全为0,这时就算后四位

- 0 0 0 1 -
- 0 0 1 0 -
- -----------
- - 0 0 0 0 -  //结果为0000,转换为十进制为0,那么1 & 2的结果就为0

|

  • 表达式1 | 表达式2

  • 计算步骤

  • 将比较的两个整数,先转换为32位二进制,然后每一位进行比较,全0才为0,其余情况全为1

例子

  • 1 | 3
  • 1 对应的二进制是0000 0000 0000 0000 0000 0000 0000 0001
  • 3 对应的二进制是0000 0000 0000 0000 0000 0000 0000 0011

进行计算

由于前30位全为0,与运算后也全为0,可以不计入计算


- 0 1 -
- 1 1 -
- -------- -
-  1 1 -     //二进制11,需要补齐32位才可以转换为十进制,那么1 | 3的结果就为3

~

  • ~表达式
  • 将这个整数全部二进制位按位取反,0变成1,1变成0

负数的存储方式

真码

-1的真码表示

> 1000 0000 0000 0000 0000 0000 0000 0001   //符号位为-表示负数,最后一位为1,表示1

使用的是8位二进制表示,但是实际上计算机存储的时候并不是这样存储的

反码

  1. 计算机拿出负数的真码
  2. 符号位不动,其余全部取反,这个时候叫做反码

补码

  1. 反码加上1就可以得到补码
  2. 计算机中存储的负数就是存储的补码
拿出真码    --> 1000 0000 0000 0000 0000 0000 0000 0001  // 也叫原码
得到反码    --> 1111 1111 1111 1111 1111 1111 1111 1110  // 真码取反
得到补码    --> 1111 1111 1111 1111 1111 1111 1111 1111  // 反码加1

所以,-1在计算机中的存储就是`1111 1111 1111 1111 1111 1111 1111 1111

以上方法只是负数的存储,正数在计算机中的存储原反补相同

取反

~1

  1. 1对应的二进制是0000 0000 0000 0000 0000 0000 0000 0001
  2. 对于二进制进行取反1111 1111 1111 1111 1111 1111 1111 1110
  3. 这个是得到存储在计算机中的补码,但是需要得到真码才能转化为二进制,下面开始转化为真码
  4. 先得到反码1111 1111 1111 1111 1111 1111 1111 1101补码-1就得到反码
  5. 然后转化为真码1000 0000 0000 0000 0000 0000 0000 0010符号位不变,其余全部取反,得到真码
  6. 真码转化为二进制位-2,所以~1的结果为-2

便捷操作

上面操作,确实可以得到一个数的取反的记过,但是过于繁琐,这里有一个便捷的方法

~x=-x-1

举例如下

~1 = -1-1 = -2
~2 = -2-1 = -3
~-2 = 2-1 = 1

快速取整

~~小数

举例如下

~~3.12345 = 3

异或运算

  • 数字1 ^ 数字2
  • 将数字1和数字2按32位二进制进行比较,不同为1,相同为0

例子

1 ^ 2

  1. 1对应的二进制为0000 0000 0000 0000 0000 0000 0000 0001
  2. 2对应的二进制为0000 0000 0000 0000 0000 0000 0000 0010
  3. 进行运算
-- 0 1 --
-- 1 0 --
---------
-- 1 1 --  // 二进制补齐32位,转换成十进制后,结果为3

移位

左移<<

  • num<:他会先把num转化为二进制,然后左移n

例子

  • 3 << 1
  1. 3对应的二进制为0000 0000 0000 0000 0000 0000 0000 0011
  2. 左移一位后是0000 0000 0000 0000 0000 0000 0000 0110
  3. 所以3 << 1 的结果为 0110 ,转换为十进制为6

左移运算,是整个32位向左移动,最后移动多少位,后面补多少0

规律

由上面的例子可以得出左移的规律num * n的2次方

负数

-10<<2 // -40

右移>>

右位移可能会丢失精度

  • 数字1 >> 数字2
  • 右位移:将数字1的二进制位(除符号外),右位移数字2的次数

例子

  • 3 >> 1
  1. 3对应的二进制为0000 0000 0000 0000 0000 0000 0000 0011
  2. 右移一位后是0000 0000 0000 0000 0000 0000 0000 0001
  3. 所以3 >> 1 的结果为 0001 ,转换为十进制为1

右移运算,是整个32位向右移动,最后移动多少位,符号位不变,前面补多少

规律

如上面3 >> 1,右移就相当于 3 / 2^1,然后去整数部分,也就是1

全右位移

  • 数字1 >>> 数字2
  • 运算过程与右位移差不多,但是,全右位移,符号位会跟着移动

例子

-1 >>> 1

  1. -1对应的二进制为1111 1111 1111 1111 1111 1111 1111 1110
  2. 全右位移后是0111 1111 1111 1111 1111 1111 1111 1111
  3. 转化为10进制是2147483647
  • https://blog.csdn.net/m0_67502005/article/details/128036344

你可能感兴趣的:(ESMAScript,js)