javascript按位操作符操作以及用途
所有的按位操作符的操作数都会被转成补码(two's complement)形式的有符号32位整数。正数的补码是自己本身,负数的补码是取反后加一,所以经过操作运算后的值是补码形式。
描述
- 按位与( AND) a & b 对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。
- 按位或(OR) a | b 对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。
- 按位异或(XOR) a ^ b 对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。
- 按位非(NOT) ~ a 反转操作数的比特位,即0变成1,1变成0。
- 左移(Left shift) a << b 将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。
- 有符号右移 a >> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位。
- 无符号右移 a >>> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。
AND
a | b | a AND b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
8 & 9
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
8
-8 & 9
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
8
OR
a | b | a OR b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
8 & 9
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
9
-8 & 9
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
11111111,11111111,11111111,11111001 // 补码
=>
11111111,11111111,11111111,11111000 // 反码
=>
10000000,00000000,00000000,00000111 //原码
=>
-7
XOR
a | b | a XOR b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
8 & 9
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 0001
=>
1
-8 & 9
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
1111 1111, 1111 1111, 1111 1111, 1111 0001 // 补码
=>
1111 1111, 1111 1111, 1111 1111, 1111 0000 // 反码
=>
1000 0000, 0000 0000, 0000 0000, 0000 1111 //原码
=>
-15
NOT
a | NOT a |
---|---|
0 | 1 |
1 | 0 |
~ 8
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000 // 补码
=>
1111 1111, 1111 1111, 1111 1111, 1111 0110 // 反码
=>
1000 0000, 0000 0000, 0000 0000, 0000 1001 // 原码
=>
-9
~-8
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
=>
0000 0000, 0000 0000, 0000 0000, 0000 0111 // not 8 补码,反码,原码
=>
7
左移
按位移动会先将操作数转换为大端 (big-endian) 表示的 32位整数,
该操作符会将第一个操作数向左移动指定的位数。向左被移出的位被丢弃,右侧用 0 补充。
8 << 3
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
0000 0000, 0000 0000, 0000 0000, 0100 0000
=>
64
-8 << 3
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000
=>
1111 1111, 1111 1111, 1111 1111, 1100 0000
=>
1111 1111, 1111 1111, 1111 1111, 1011 1111
=>
1000 0000, 0000 0000, 0000 0000, 0100 000
=>
-64
右移
该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。
8 >> 3
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
0000 0000, 0000 0000, 0000 0000, 0000 0001
=>
1
-8 >> 3
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000
=>
1111 1111, 1111 1111, 1111 1111, 1111 1111
=>
1111 1111, 1111 1111, 1111 1111, 1111 1110
=>
1000 0000, 0000 0000, 0000 0000, 0000 001
=>
-1
无符号右移
该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。即便右移 0 个比特,结果也是非负的?
8 >>> 3
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
0000 0000, 0000 0000, 0000 0000, 0000 0001
=>
1
-8 >>> 3
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000
=>
0001 1111, 1111 1111, 1111 1111, 1111 1111
=>
0001 1111, 1111 1111, 1111 1111, 1111 1110
=>
0110 0000, 0000 0000, 0000 0000, 0000 001
=>
805306369
用途
想想看linux的文件权限就是这样做到的。简单的数字就可以表示你有什么权限。比如我们有4个状态,A,B,C,D,分别用二进制保存
- A 0001=> 1
- B 0010 => 2
- C 0100 => 4
- D 1000 => 8
如果你的状态是 A+B+C 那么你的权值就是 (A | B | C ) => 0111 => 7。这个时候做状态判断是就好做了。用D的值和你按位与下,看看值是否为1,就知道你有没有对应的权限
if(8 & your_status){
// your have status
}else{
// your don't have status
}
javascript按位操作符操作以及用途的更多相关文章
- javascript 的位操作符转换推断
var a = "10" | 0; alert(a); alert (typeof a); 结果为10,number. 这就是说这条语句可以将字符串转化为number. 如果: v ...
- 按位操作符(Bitwise operators)
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...
- js中的位运算符 ,按位操作符
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...
- 为什么不要在 JavaScript 中使用位操作符?
如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...
- 浅谈JavaScript位操作符
因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...
- JavaScript 32位整型无符号操作
在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^ ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- javascript运算符——位运算符
× 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度 ...
- 关于JavaScript中的delete操作
关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...
随机推荐
- iOS 10 中引入了 Message 框架
WWDC 2016 上最重磅的消息之一就是在 iOS 10 中引入了 Message 框架.开发者现在可以为苹果内置的 Messages 应用开发扩展啦.通过开发一个应用扩展,你可以让用户跟应用在 M ...
- php在IIS上put,delete请求报404
方法一:配置C:\Windows\System32\inetsrv\Config\applicationHost.conf的put,delete 方法二:网传最广之方法,修改项目的web.config ...
- Muduo网络库源代码分析(四)EventLoopThread和EventLoopThreadPool的封装
muduo的并发模型为one loop per thread+ threadpool.为了方便使用,muduo封装了EventLoop和Thread为EventLoopThread,为了方便使用线程池 ...
- SQL SERVER 查看表是否存在
查看表是否存在 if exists(select 1 from sysobjects where id = OBJECT_ID('数据库名称.dbo.表明称')) drop table 为字段添加注释 ...
- Hadoop生态优秀文章集锦
如何用形象的比喻描述大数据的技术生态?Hadoop.Hive.Spark 之间是什么关系? https://www.zhihu.com/question/27974418 HBase 和 Hive 的 ...
- 九度OJ 1346:会员积分排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:967 解决:413 题目描述: 元旦佳节快到了,超市A想要给会员一些奖品.但是奖品有限,所以它需要给这些会员做一个排序,然后将名单输出来.排 ...
- nginx的location
nginx的location分为普通location和正则location. 在普通location中,匹配规则是最大前缀匹配. 在正则location中,匹配规则是先到先得匹配.(最先匹配的正则lo ...
- iOS设备获取总结
1.获取iOS设备的各种信息 // 这个方法后面会列出来 NSString *deviceName = [self getDeviceName]; NSLog(@"设备型号-->%@& ...
- TensorFlow_action
安装TensorFlow 包依赖 C:\Users\sas> pip3 install --upgrade tensorflow Collecting tensorflow Downloadi ...
- 【python】-- Socket接收大数据
Socket接收大数据 上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整 ...