js中的位运算只对整数起做用,由于位操做都有ToInt32这一步,从而舍弃小数部分java
十六进制 | 二进制 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
A | 1010 |
B | 1011 |
C | 1100 |
D | 1101 |
E | 1110 |
F | 1111 |
计算机中数是以二进制补码进行存储的,正数的原码、反码、补码都是同样,负数的补码是原码的反码再加1,这样能够减法运算可使用加法器实现,符号位也参与运算(二进制的最高位为符号位0为正,1为负,以8位来算,最高位为符号位,其他7位表示数值),取反码与符号位无关。code
int类型的数占用4字节(32位)。5转换成二进制是101,不满32位会在前面填充0。那么5在计算机中表示为:
00000000 00000000 00000000 00000101
原码:一个整数,按照绝对值大小转换成的二进制数;
反码:将二进制数按位取反【1变0,0变1】;
补码:反码加 1;数学
如十进制: -5console
原码: 00000000 00000000 00000000 00000101 反码:11111111 11111111 11111111 11111010 补码(反码加一):11111111 11111111 11111111 11111011
因此 -5 的二进制是 11111111 11111111 11111111 11111011,转换为十六进制:0xFFFFFFFB
。table
如补码是:11111111 11111111 11111111 11110010class
补码: 11111111 11111111 11111111 11110010 反码(补码减一):11111111 11111111 11111111 11110001 按位取反,原码:00000000 00000000 00000000 00001110
原码00000000 00000000 00000000 00001110
即14, 而后取反就是 -14。语法
<<
左移运算规则: 按二进制形式把全部的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
语法格式: 须要移位的数字 << 移位的次数。
数学意义: 若是是10进制向左移动一位至关于乘10倍,移两位乘10的2次方倍,因此在数字没有溢出的前提下,对于正数和负数,二进制左移n位就至关于乘以2的n次方。二进制
/** 3 << 2 **/ 3转化为二进制: 00000011 移动补位:00001100 转化为十进制:12
3 * 2 ^ 2 = 3 * 4 = 12
计算机
为何没有无符号左移<<< ?
由于左位移是填补右边空出的位,符号位不影响它的值。
>>
带符号右移运算规则: 按二进制形式把全部的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。【补的位数所有是符号位】
语法格式: 须要移位的数字 >> 移位的次数
数学意义: 右移一位至关于除2,右移n位至关于除以2的n次方。商若为小数,取整便可。tab
/** 11 >> 2 **/ 11转化为二进制: 0000 1011 移动补位:0000 0010 转化为十进制:2
11 / 2^2 = 11 / 4 = 2
例如: -100 >> 4【-100带符号右移4位】
-100原码:00000000 00000000 00000000 01100100 -100反码:11111111 11111111 11111111 10011011 -100补码:11111111 11111111 11111111 10011100 右移4位,在高位补1:11111111 11111111 11111111 11111001
补码形式的移位完成后,结果不是移位后的结果,要根据补码写出原码才是最后的结果。
减一:11111111 11111111 11111111 11111000 按位取反:00000000 00000000 00000000 00000111 添加符号位:10000000 00000000 00000000 00000111 结果:-7
>>>
无符号右移>>>
运算符执行无符号右移位运算,它把无符号的 32 位整数全部数位总体右移。最左侧空位再也不用符号位的值来填充,而是用 0 来填充。
// 对于无符号数或正数,无符号右移与有符号右移运算结果相同。 console.log(1000 >> 8); // 3 console.log(1000 >>> 8); // 3 console.log(-1000 >> 8); // -4 console.log(-1000 >>> 8); // 16777212
~
非运算规则: 操做数被转换为32位二进制表示(0和1)。超过32位的数字将丢弃其最高有效位。
语法格式: ~ 操做数。
数学意义: 任何数 x 的运算结果都是-(x + 1)
。~-5
运算结果为`4;
/** ~ 5 **/ 5转化为二进制: 00000000 00000000 00000000 00000101 位数取反: 11111111 11111111 11111111 11111010 【补码】 反码:11111111 11111111 11111111 11111001 原码:00000000 00000000 00000000 00000110 添加符号位:10000000 00000000 00000000 00000110 转化为十进制: -6 const a = 5; console.log(~a); // -6
&
与运算规则: 第一个操做数的的第n位与第二个操做数的第n位对比,若是都是1,那么第n位的结果为1,不然为0;同真为真,一假为假
。
5转换为二进制:00000000 00000000 00000000 00000101 3转换为二进制:00000000 00000000 00000000 00000011 5 & 3 结果:00000000 00000000 00000000 00000001
5 & 3 结果:00000000 00000000 00000000 00000001, 转化为二进制是1;
|
或运算规则: 第一个操做数的的第n位与第二个操做数的第n位对比,只要有一个是1,那么第n位的结果为1,不然为0;一真为真,同假为假
5转换为二进制:00000000 00000000 00000000 00000101 3转换为二进制:00000000 00000000 00000000 00000011 5 | 3 结果:00000000 00000000 00000000 00000111
5 | 3 结果:00000000 00000000 00000000 00000111, 转化为二进制是7;
^
异或运算规则: 第一个操做数的的第n位与第二个操做数的第n位对比,若是相反那么第n位结果的为1,不然为0;同为假,异为真
5转换为二进制:00000000 00000000 00000000 00000101 3转换为二进制:00000000 00000000 00000000 00000011 5 ^ 3 结果:00000000 00000000 00000000 00000110
5 ^ 3 结果:00000000 00000000 00000000 00000110, 转化为二进制是6;
a & 1 == 0; // 偶数 a & 1 == 1; // 奇数
异或运算有以下特性:a ^ b ^ a = b; a ^ b ^ b = a
x ^= y; y ^= x; x ^= y;