Js中的位操作符

JavaScript的数字类型为双精度IEEE 754 64位浮点类型,但是在位运算中位运算符用于32位的数字上, 任何的数字操作都将转为32位, 运算结果再转化为Js数字类型。

描述

所有的按位操作符的操作数都会被转成补码形式的有符号32位整数,从概念上讲,按位逻辑操作符按遵守下面规则:

  • 操作数被转换成32位整数,用比特序列(01组成)表示,超过32位的数字会被丢弃。
  • 第一个操作数的每个比特位与第二个操作数的相应比特位匹配,第一位对应第一位,第二位对应第二位,以此类推。
  • 位运算符应用到每对比特位,结果是新的比特值。

& 按位与(AND)

对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0,真值表如下:

a b a & b
0 0 0
0 1 0
1 0 0
1 1 1

我们可以使用&操作符来判断数值的奇偶性。

console.log(7 & 1);    // 1
console.log(8 & 1) ; // 0

| 按位或(OR)

对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0,真值表如下:

a b a | b
0 0 0
0 1 1
1 0 1
1 1 1

我们可以使用|操作符来强制转换值为int 3232位整数类型。

console.log(11.11 | 0);      // 11
console.log("11.11" | 0); // 11
console.log("-11.11" | 0); // -11
console.log(1.23E2 | 0); // 123
console.log([] | 0); // 0
console.log(({}) | 0); // 0

^ 按位异或(XOR)

对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0,真值表如下:

a b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

我们可以使用^操作符来交换数值。

let a = 7;
let b = 1;
a ^= b;
b ^= a;
a ^= b;
console.log(a); // 1
console.log(b); // 7 // 也可以借助数组
b = [a, a = b][0]; // 当然解构赋值更简单
[a, b] = [b, a];

也可以用来判断值的符号是否相同。

let a = 1;
let b = 1;
console.log((a ^ b) >= 0); // true
console.log((a ^ -b) >= 0); // false

~ 按位非(NOT)

对于每一个比特位,反转操作数的比特位,即0变成11变成0,真值表如下:

a ~ a
0 1
1 0

我们可以使用~操作符来强制转换值为int 3232位整数类型。

console.log(~~(11.11));      // 11
console.log(~~("11.11")); // 11
console.log(~~("-11.11")); // -11
console.log(~~(1.23E2)); // 123
console.log(~~([])); // 0
console.log(~~({})); // 0

<< 左移

将值的二进制形式向左移n (n < 32)比特位,右边用0填充。

我们可以使用<<操作符来进行整数的* 2^n运算。

console.log(11 << 2);         // 44
console.log(11.11 << 1); // 22
console.log("11.11" << 1); // 22

我们可以使用<<操作符来强制转换值为int 3232位整数类型。

console.log(11.11 << 0);      // 11
console.log("11.11" << 0); // 11
console.log("-11.11" << 0); // -11
console.log(1.23E2 << 0); // 123
console.log([] << 0); // 0
console.log(({}) << 0); // 0

>> 有符号右移

将值的二进制表示向右移n (n < 32)位,丢弃被移出的位。

我们可以使用<<操作符来进行整数的/ 2^n运算。

console.log(32 >> 2);         // 8
console.log(32.11 >> 1); // 16
console.log("32.11" >> 1); // 16

我们可以使用>>操作符来强制转换值为int 3232位整数类型。

console.log(11.11 >> 0);      // 11
console.log("11.11" >> 0); // 11
console.log("-11.11" >> 0); // -11
console.log(1.23E2 >> 0); // 123
console.log([] >> 0); // 0
console.log(({}) >> 0); // 0

>>> 无符号右移

将值的二进制表示向右移n (n< 32)位,丢弃被移出的位,并使用0在左侧填充,所以结果总是非负的,即便右移0个比特,结果也是非负的,所以对于>>>一般不用于负数操作。

我们可以使用<<操作符来进行整数的/ 2^n运算,注意不用于负数的运算。

console.log(32 >>> 2);         // 8
console.log(32.11 >>> 1); // 16
console.log("32.11" >>> 1); // 16

我们可以使用>>操作符来强制转换值为int 3232位整数类型,注意不用于负数的运算。

console.log(11.11 >>> 0);      // 11
console.log("11.11" >>> 0); // 11
console.log(1.23E2 >>> 0); // 123
console.log(null >>> 0); // 0
console.log([] >>> 0); // 0
console.log(({}) >>> 0); // 0

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://www.jianshu.com/p/6c3851ce83f7
https://www.cnblogs.com/mtl-key/p/13150674.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

Js中的位操作符的更多相关文章

  1. 为什么不要在 JavaScript 中使用位操作符?

    如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...

  2. js中的new操作符与Object.create()的作用与区别

    js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...

  3. js中的位运算符 ,按位操作符

    按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...

  4. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  5. JS中的一元操作符

    表达式 一元操作符 优先级 结合性 运算顺序 表达式是什么? 就是JS 中的一个短语,解释器遇到这个短语以后会把对它进行计算,得到一个结果参与运算,我们把这种要参与到运算中的各种各样的短语称为表达式. ...

  6. 深入研究js中的位运算及用法

    什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算有时我们还能实现更简单的程序 ...

  7. JS中的new操作符

    在JS中定义一个构造函数,然后用new操作符构造对象obj,JS代码如下. function Base(){ this.name = "swf"; this.age =20; } ...

  8. JS中的 new 操作符简单理解

    首先上一一个简单的 new 操作符实例 var Person = function(name){ this.name = name; this.say = function(){ return &qu ...

  9. JS中的delete操作符

    首先,delete删除成功返回true,失败返回false. js代码: function wxCount ($element) { this.init($element); } wxCount.pr ...

  10. JS 中的 new 操作符

    按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上.这个话很抽象,我想 ...

随机推荐

  1. CSS 动画 : 3D翻页动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Python Code_05位运算

    coding:utf-8 author : 写bug的盼盼 development time : 2021/8/28 7:16 print(4&8)#非1即0 print(4|2)#同0即0, ...

  3. 【Kafka系列】(一)Kafka入门

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 Kafka是什么? 一句话概括:Apache K ...

  4. [转帖]“炫技” 还是 “真硬核”,OpenPPL 实测阿里「倚天 710」芯片

    https://my.oschina.net/openppl/blog/5524424   本文将以深度学习模型推理应用为出发点,对「倚天 710」这款 ARM Server 芯片进行性能方面的实测. ...

  5. 基于OpenJDK部署clickhouse-local镜像的快捷方法

    基于OpenJDK部署clickhouse-local镜像的快捷方法 摘要 前期搭建了一套基于OpenJDK的Clickhouse的服务端的镜像 可以简单使用dbeaver进行连接与使用. 后来发现需 ...

  6. [转帖]如何在KingbaseES数据库查看数据库和表的大小

    关键字 kingbaseES,数据库大小,表大小 1.查看单个数据库的大小 使用ksql连接到数据库,使用sys_database_size函数 kapp=# select sys_database_ ...

  7. [转帖]Jmeter_jmeter-plugins插件的安装使用

    一.安装JMter Plugins 1.官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter ...

  8. [转帖]优化命令之iotop命令

    文章目录 引言 一.iotop简介 1.iotop安装 2.iotop语法 3.iotop参数 二.I/O的常用快捷键 三.交互模式 四.iotop示例 1.只显示正在产生I/O的进程 2.显示指定P ...

  9. [转帖]重置 VCSA 6.7 root密码和SSO密码

    问题描述 1.用root用户登录 VMware vCenter Server Appliance虚拟机失败,无法登录 2.vCenter Server Appliance 6.7 U1的root帐户错 ...

  10. Linux 安装宋体字体的简单办法

    1. 今天同事说测试环境(CentOS) 打印有异常,无法将汉字正常打印出来. 2. 开发同事提供的思路是安装上宋体的字体再进行尝试,并且给出了一个解决方案的地址: https://blog.csdn ...