一、位运算符将它的操作数视为32位元的二进制串(0和1组成),而非十进制八进制或十六进制数。
【示例】十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准的JavaScript数值。 |
---|
二、位运算符
Operator | Usage | Description |
---|---|---|
按位与 AND | a & b | 在a,b的位表示中,每一个对应的位都为1,则返回1,否则返回0 |
按位或 OR | a | b | 在a,b的位表示中,每一个对应的位都为0,则返回0 |
按位异或 XOR | a ^ b | 在a,b的位表示中,每一个对应的位,两个不相同则返回1,相同则返回0 |
按位非 NOT | ~ a | 反转被操作数的位 |
左移 shift | a << b | 将二进制串向左移动b位,右边移入0 |
算术右移 | a >> b | 把a的二进制表示向右移动b位,丢弃被移出的所有位 |
无符号右移 (左边空出位用0填充) |
a >>> b | 把a的二进制表示向右移动b位,丢弃被移出的所有位,并把左边空出的位都填充为0 |
【示例】1 & 2的结果为 答案:0 解析:1=0001 2=0010 按位与运算,同为1才为1,否则返回0 |
---|
【示例】0xff ^ 33 的结果是: A. 220 B. 221 C. 222 D. 223 答案:C 解析:考察点:异或运算符、进制转换 1、^: 表示的是异或运算符 ,规则:两值同为0,不同为1 2、0xff是十六进制的255,33是十进制,先得转换成都是二进制才能进行异或运算 3、0xff表示16进制的ff, 即16*15+15 = 255,255=27+26+25+24+23+22+21+20 33=25+1 , 也就是在最高位有1,最末位也有一个1 (1)现在将它们两个2进制化表达就是: 0xff ——> 255 ——> 1111 1111 33 ——> 33 ——> 0010 0001 4、这两个进行异或运算后是 1101 1110 (二进制) (1)二进制的1101 1110 转换为10进制就是:128+64+0+16+8+4+2+0 = 222 |
---|
四、这些运算符在web开发中很少被使用,一般是我们需要在最低级别(位)上操作数字时才使用。但在某些特殊领域中,例如密码学,它们很有用。当你需要了解它们的时候,可以阅读 MDN 上的位操作符章节。
运算符类型
位逻辑运算符
一、位逻辑运算符的工作流程
1、操作数被转换为32bit整数,以位序列(0和1组成)表示。若超过32bits,则取低位32bit,如下
Before: 11100110111110100000000000000110000000000001
After: 10100000000000000110000000000001
2、第一个操作数的每一位都与第二个操作数的对应位组对:第一位对应第一位,第二位对应第二位,以此类推。
3、运算符被应用到每一对“位”上,最终的运算结果由每一对“位”的运算结果组合起来。
【示例】十进制数9的二进制表示是1001,十进制数15的二进制表示是1111。因此,当位运算符应用到这两个值时,结果如下 |
---|
表达式 | 结果 | 二进制描述 |
---|---|---|
15 & 9 | 9 | 1111 & 1001 = 1001 |
15 | 9 | 15 | 1111 | 1001 = 1111 |
15 ^ 9 | 6 | 1111 ^ 1001 = 1111 |
~15 | -16 | ~ 00000000…00001111 = 1111 1111 … 11110000 |
~9 | -10 | ~ 00000000…0000 1001 = 1111 1111 … 1111 0110 |
4、位运算符“非”将所有的32位取反,而值的最高位(最左边的一位)为1,则表示负数(2-补码表示法)
移位运算符
一、移位运算符带两个操作数:第一个是待移位的数,第二个是指定第一个数要被移多少位的数。
二、移位的方向由运算符来控制。
三、移位运算符把操作数转为32bit整数,然后得出一个与移位数相同种类的值。
四、移位运算符
运算符 | 描述 | 范例 |
---|---|---|
<<(左移位) | 将第一个操作数向左移动指定数量的位。左边移出位被抛弃。左边移出的几位被丢弃,右边多出的空位由0补齐 | 9 << 2产生36,因为1001移位2比特向左变为100100,它是36 |
>>(带符号右移) | 将第一个操作数向右移动指定数量的位。右边移出位被抛弃,左边多出的空位由原值的最左边数字补齐。 | 9 >> 2产生2, 因为1001移位2位向右变为10,其是2。同样, -9 >> 2产生-3,由于符号被保留。 |
>>> (补零右移) | 将第一个操作数向右移动指定数量的位。右边移出位被抛弃,左边多出的空位由0补齐。 | 19 >>> 2产生4,因为10011移位2位向右变成100,它是4。对非负数值,补零右移和带符号右移产生相同结果。 |
位运算符技巧
一、~~常用来取整
- 数组类型 => 纯数字
- 字符串中带了除数字外的东西 => Number类型的0
- bolean,true => 1, false => 0
- 特殊类型,转化为boolean是true => 1, 转化为boolean是false => 0
| 【示例】
- 数字类型的字符串可以转化为纯数字
```javascript var a=’123’; console.log(~~a); //输出123<br />- 字符串中带了其他字母,符号,或者其他除数字外的东西,一律输出 Number类型的0<br />```javascript
var a='asd';
console.log(~~a); //输出0
- 任何boolen类型的,如果为TRUE则输出1,FALSE输出0;
```javascript var a=1==1; console.log(~~a);//输出1
| | —- |<br />- 特殊类型,转化为Boolean是true的输出1,转化为boolean是false的输出0;<br />```javascript var a=undefined; console.log(~~a);//输出0 var b=!undefined; console.log(~~b);//输出1