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. 【MicroPython】 mp对象和 c 类型的转换

    [来源]https://www.eemaker.com/micropython-mp-toc.html

  2. JMS Controller生命周期

  3. JMS微服务开发示例(六)安全退出进程

    默认情况下,如果在linux,需要关闭微服务进程,请务必使用 kill -15 进程id 命令,其他命令可能会直接关闭进程,造成数据丢失. 例如,有个后台任务,执行了一半,这时候进程突然关闭了,会形成 ...

  4. 程序&命名-执行环境

    开发程序执行环境 系统级别 -- 编译器或解释器 程序级别 -- 命令行参数.配置文件 执行级别 -- 进程.线程.协程运行时上下文(树(命名空间 -- 函数-局部变量.包或模块-全局变量)) 命令行 ...

  5. [转帖]两种Nginx日志切分方案,狼厂主要在用第1种

    两种Nginx日志切分方案,狼厂主要在用第1种 nginx的日志切分问题一直是运维nginx时需要重点关注的.本文将简单说明下nginx支持的两种日志切分方式. 一.定时任务切分 所谓的定时任务切分, ...

  6. 【转帖】Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

    一.网络流量上不去二.中断绑定2.1 关闭中断平衡守护进程2.2 脱离中断平衡守护进程2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上 ...

  7. jconsole的简单学习

    摘要 jconsole 是JDK自带的一款图形化监测工具 他可以监测本地程序,也可以检测远程的机器 在没有其他监控手段可以使用的情况下可以快速进行必要的监测 使用方法也比较简单. 本地监控 jcons ...

  8. JavaScript一种新的数据结构类型Map

    什么是map 它类似于对象,是键值对的集合,但键的范围不局限在于字符串.各种类型的值(包含对象)都可以作为键. 如果同一个键被多次赋值,后面的值将会覆盖其那面的值.如果读取一个未知的键,返回的是und ...

  9. Promise练习文件读取

    1. fs读取文件 const fs=require('fs');//引入文件读取模块 fs.readFile('./README.md',(err,data)=>{ // 如果出现错误,抛出错 ...

  10. ABP系列文章收藏

    1.ASP.NET样板开发框架ABP系列之ABP入门教程详解: https://www.php.cn/csharp-article-380181.html 2.官网中文翻译:  https://www ...