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将被绑定到那个新对象上.这个话很抽象,我想 ...
随机推荐
- [转帖]2024年正常使用windows XP之一:系统下载篇
https://zhuanlan.zhihu.com/p/347764175 半夏:2024年正常使用windows XP之一:系统下载篇 半夏:2024年正常使用windows XP之二:补丁及运行 ...
- [转帖]linux下/proc/sysrq-trigger详解
/proc/sysrq-trigger详解 这是一组"魔术组合键",只要内核没有被完全锁住,不管内核在做什么事情,使用这些组合键能即时打印出内核的信息. 使用SysRq组合键是了解 ...
- Windows 环境下简单的自动备份以及清理数据库的操作过程
今天能想到要简单的备份一下windows上面的数据库. 然后并且能够定期清理文件. 然后从网上找了一下 找到把饭如下 1. 备份 创建一个目录用来存放数据库备份 c:\dbbak 然后编写一个脚本, ...
- IBM Z15设备信息
- 不想做架构师的Gopher不是好程序员
最近我们在组队学习<手把手带你写一个web框架>,强制PUSH,坚持每天学习打卡,不完成惩罚发红包的那种. 你别说,效果还真挺好. 昨天学到了架构部分,很受启发,光学不写假把式.(还是得坚 ...
- MySQL新增数据,修改数据,删除数据
连接本地mysql语句 mysql -hlocalhost -uroot -proot DML-介绍 DML英文全称是:用来对数据库中表的数据记录进行 增 删 改 操作. 增加使用 insert 删除 ...
- 原生js中offsetTop, offsetLeft与offsetParent的详细讲解
简单说下:offsetTop offsetTop: 为只读属性. 返回的是一个数字. 它返回当前元素相对于其 offsetParent 元素的顶部内边距的距离. 它等价于offsetTop==> ...
- uni-app事件冒泡 如何解决事件冒泡 推荐tap事件
冒泡事件## 冒泡事件 <view class="max-box" @tap="waimian"> 外面 <view class=" ...
- Docker系列教程01--简介
Docker 入门教程 作者: 阮一峰 日期: 2018年2月 9日 2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业. 但是,许多人并不清楚 Docker 到底是什么, ...
- 手撕Vue-实现计算属性
前言 经过上一篇的学习, 完成了将数据代理到了 Nue 的实例上方,这个我们已经撕完了.接下来要实现的是计算属性,计算属性的实现原理是通过 Object.defineProperty() 来实现的,我 ...