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 我 ...
随机推荐
- CSU 1663: Tree(树链剖分)
1663: Tree Time Limit: 5 Sec Memory Limit: 128 MB Submit: 26 Solved: 11 [Submit][id=1663"> ...
- Effective C++ 49,50
49.熟悉标准库. C++标准库非常大. 首先标准库中函数非常多,为了避免名字冲突.使用命名空间std.而之前的库函数都存放于< .h>中,如今成为伪标准库.而不能直接将这些头文件所有直接 ...
- html5小趣味知识点系列(一)spellcheck
发现一些h5的系ode知识点增加一些趣味性 实用性 不敢妄自评论 觉得有用就用一下 没用就路过一下 spellcheck属性 它的功能是针对用户输入的文本内容进行拼写和语法检查 用于input 和 ...
- 自定义tabpageindicator,可以自定义tab是三角形还是矩形,但是tab不具有滑动的功能
我是不会滴,但是看了一些大神写的,我修改了一下,大家可以参照参照 一,自定义Mytabpageindicator,直接贴代码了,具体的在代码中有注释 package com.wangy.mytabpa ...
- SVN流程图协作图
- GCD(st表+二分)
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- EasyNVR、EasyDSS二次开发之:RTMP、HLS流在web页面进行无插件播放示例Demo代码
不管是基于EasyNVR还是EasyDSS,都是支持无插件直播,这也是未来视频直播的一个趋势.对于传统的浏览器插件播放谁用谁知道: 以上是软件自带播放展示 背景需求 对于EasyNVR和EasyDSS ...
- 反应器模式 vs 生产者消费者模式
相似点: 从结构上,反应器模式有点类似生产者消费者模式,即有一个或多个生产者将事件放入一个Queue中,而一个或多个消费者主动的从这个Queue中Poll事件来处理: 不同点: Reactor模式则并 ...
- [note]高精度模板
高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...
- Linux c编程:I/O多路复用之epoll
前面介绍了select处理,这一章继续介绍另外一种I/O多路服用的机制:epoll.来比较下两种机制的不同点. select: 调用过程如下: (1)使用copy_from_user从用户空间拷贝fd ...