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. Git Clone一个GitHub仓库时,发生报错

    1.问题 1.使用HTTP方式:Git: fatal: unable to access ' https://github. com/Light-City/CPlusPlusThings. git/' ...

  2. 最新版TikTok 抖音国际版解锁版 v33.1.4 去广告 免拔卡

    软件简介: 抖音国际版App是全球最受欢迎的短视频应用,抖音国际版TikTok(海外版)横扫全球下载量常居榜首.这是最新抖音国际版解锁版,无视封锁和下载限制,国内免拔卡,去除了广告,下载视频无水印(T ...

  3. GoMusic-歌单迁移工具网站 一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music

    GoMusic是什么: GoMusic是一个在线歌单迁移工具网站,帮助用户一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music,直接输入歌单链接,复制查询结果,打开 ...

  4. [转帖]京东大佬细说:Nginx反向代理时保持长连接,看完直呼"学到了!"

    https://mp.weixin.qq.com/s?__biz=MzU1MzE2NzIzMg==&mid=2247488405&idx=1&sn=7081ff4e0ac1de ...

  5. [转帖]Redis 内存淘汰策略 (史上最全)

    1.前言 Redis内存淘汰策略,是被很多小伙伴忽略的知识盲区,注意,是盲区. 注意,Redis如果内存淘汰策略配置不合理,可能会导致Redis无法服务. 所以,使用此文,对Redis内存淘汰策略专门 ...

  6. [转帖]Mnesia reports that this RabbitMQ cluster has experienced a network partition.

    一 问题描述 双节点RabbitMQ集群发生了脑裂,节点日志报错: [error] <0.6318.0> Mnesia(rabbit@pc2): ** ERROR ** mnesia_ev ...

  7. [转帖]容器化 TCP Socket 缓存、接收窗口参数

    https://blog.mygraphql.com/zh/notes/low-tec/network/tcp-mem/#rmem_default 最近需要支持一个单 POD 的 TCP 连接数上 1 ...

  8. 极简版 haproxy的搭建步骤

    背景 发现四层nginx的代理报错. 然后想着换用一下haproxy的配置. 早些时候 看过tidb的一些最佳时间, 这里简单整理一下. 下载 https://src.fedoraproject.or ...

  9. nginx 反向代理 负载均衡的做法

    项目上使用负载均衡的方法, 感觉最简单的办法其实是 http的 upstream  注意需要保留端口号信息. worker_processes 4; events { worker_connectio ...

  10. Docker 部署 Ceph的简单方法

    https://zhuanlan.zhihu.com/p/390377674 学习一下. docker部署 部署的思路和网络架构和前面分布式是一样的,区别在于命令的形式. 在每个节点安装 docker ...