Js中的位操作符
Js中的位操作符
JavaScript的数字类型为双精度IEEE 754 64位浮点类型,但是在位运算中位运算符用于32位的数字上, 任何的数字操作都将转为32位, 运算结果再转化为Js数字类型。
描述
所有的按位操作符的操作数都会被转成补码形式的有符号32位整数,从概念上讲,按位逻辑操作符按遵守下面规则:
- 操作数被转换成32位整数,用比特序列(
0和1组成)表示,超过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 32即32位整数类型。
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变成1,1变成0,真值表如下:
| a | ~ a |
|---|---|
| 0 | 1 |
| 1 | 0 |
我们可以使用~操作符来强制转换值为int 32即32位整数类型。
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 32即32位整数类型。
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 32即32位整数类型。
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 32即32位整数类型,注意不用于负数的运算。
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中的位操作符的更多相关文章
- 为什么不要在 JavaScript 中使用位操作符?
如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...
- js中的new操作符与Object.create()的作用与区别
js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...
- js中的位运算符 ,按位操作符
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...
- js中的位运算
按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...
- JS中的一元操作符
表达式 一元操作符 优先级 结合性 运算顺序 表达式是什么? 就是JS 中的一个短语,解释器遇到这个短语以后会把对它进行计算,得到一个结果参与运算,我们把这种要参与到运算中的各种各样的短语称为表达式. ...
- 深入研究js中的位运算及用法
什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算有时我们还能实现更简单的程序 ...
- JS中的new操作符
在JS中定义一个构造函数,然后用new操作符构造对象obj,JS代码如下. function Base(){ this.name = "swf"; this.age =20; } ...
- JS中的 new 操作符简单理解
首先上一一个简单的 new 操作符实例 var Person = function(name){ this.name = name; this.say = function(){ return &qu ...
- JS中的delete操作符
首先,delete删除成功返回true,失败返回false. js代码: function wxCount ($element) { this.init($element); } wxCount.pr ...
- JS 中的 new 操作符
按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上.这个话很抽象,我想 ...
随机推荐
- [转帖]TLS/SSL (Schannel SSP) 中的密码套件
https://learn.microsoft.com/zh-cn/windows/win32/secauthn/cipher-suites-in-schannel 密码套件是一组加密算法. TLS/ ...
- 阿里云龙蜥8.6部署SQLSERVER2022的过程
阿里云龙蜥8.6部署SQLSERVER2022的过程 背景 之前总结过, 但是发现当时是preview版本. 这里想升级一下, 并且顺便抄一下他的部分说明 下载 wget https://packag ...
- [转帖]使用 TiUP 部署 TiDB 集群
https://docs.pingcap.com/zh/tidb/stable/production-deployment-using-tiup TiUP 是 TiDB 4.0 版本引入的集群运维工具 ...
- [转帖]带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
https://tidb.net/blog/29074d86#TiDB%20%E6%80%A7%E8%83%BD%E5%92%8C%E7%A8%B3%E5%AE%9A%E6%80%A7%E7%9A%8 ...
- [转帖]Docker-Compose 自动创建的网桥与局域网冲突解决方案
https://zhuanlan.zhihu.com/p/379305319 Docker-Compose 自动创建的网桥与局域网冲突解决方案 当我使用docker-compose的方式部署内网的ha ...
- [转帖]Lightning 实操指南
2.2.2 Lightning 实操指南 这一节将介绍如何使用 Lightning 导入数据的实操 2.2.2.1 TiDB Lightning 快速开始 注意 TiDB Lightning 运行后, ...
- [转帖]最全MySQL锁讲解:页锁、共享锁、行锁、表锁、悲观锁、乐观锁
我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从 ...
- [转帖]基本系统调用性能lmbench测试方法和下载
简介 Lmbench是一套简易,可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具.一般来说,它衡量两个关键特征:反应时间和带宽. Lmbench旨在使系统开发者深入了解关键操作 ...
- [转帖]Linux性能测试之unixbench
https://www.modb.pro/db/487945 大家好,昨天为大家带来了一篇关于在Linux下性能测试的文章<性能测试之LTP>,今天继续为大家推荐系列工具之unixbenc ...
- Springboot actuator的简单使用
Springboot actuator的简单使用 简介 公司基于springboot研发的系统,开发已经默认集成了actuator 为了安全起见这个插件模式是不开启的. 今天与研发同事进行了沟通,简单 ...