整数在计算机中的存储
在计算机中用32位表示一个数。
ECMAScript标准中,整数有两种类型,有符号整数(表示正数和负数)和无符号整数(只能是正数)。有符号整数的前31位表示数字,第32位表示符号,0为正数,1为负数;无符号整数的32位全部表示数字。
有符号数字范围:-2147483648 — 2147483648
无符号数字范围:0 — 4294967296
在ECMAScript中,所有整数字面量默认都是有符号整数。
18: 0000 0000 0000 0000 0000 0000 0001 0010
let num = 18;
console.log(num.toString(2));
//输出10010
二进制数转化成十进制
负数转化成二进制数
1、把该数的整数版本转化成二进制数
2、取该二进制数的反码(0变成1,1变成0)
3、反码加一
-18
0000 0000 0000 0000 0000 0000 0001 0010
1111 1111 1111 1111 1111 1111 1110 1101
1111 1111 1111 1111 1111 1111 1110 1110
let num = -18;
console.log(num.toString(2));
//输出 -10010
可以看出输出的不是完整的二进制数,而是其绝对值的二进制加上-号
位运算符
NOT(~)、AND(&)、OR(|)、XOR(^)、左移(<<)、有符号右移(>>)、无符号右移(>>>)
位运算符NOT(~)
处理过程:
1、转换成32位的二进制数
2、取二进制数的反码
3、把反码转换成浮点数
示例:
let num = 4;
console.log(~num);
//输出: -5
可以发现其实是 -4-1 = -5
位运算符AND(&)
计算规则:
处理过程:
1、将两边的数转化成32位二进制数
2、右对齐按照计算规则计算
示例:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001
console.log(25 & 3) ;
//输出1
位运算符OR(|)
计算规则:
处理过程:
1、将两边的数转化成32位二进制数
2、右对齐按照计算规则计算
示例:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011
console.log(25 | 3);
//输出27
位运算符XOR(^)
计算规则:
处理过程:
1、将两边的数转化成32位二进制数
2、右对齐按照计算规则计算
示例:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
console.log(25 ^ 3);
//输出26
左移运算(<<)
处理过程:
1、转化成二进制数
2、保留符号位不动,把表示数字的位左移指定位数
3、右侧末尾补充上指定位数个0
示例:
25 << 5
25 = 0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0011 0010 0000
console.log(25 << 5);
//输出800
有符号右移运算(>>)
处理过程:
1、转化成二进制数
2、保留符号位不动,把表示数字的位右移指定位数
3、左侧空位补充上指定位数个0
示例:
25 >> 5
25 = 0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0000 0000
console.log(25 >> 5);
//输出0
console.log(25 >> 2);
0000 0000 0000 0000 0000 0000 0000 0110
//输出6
无符号右移运算(>>>)
处理过程:
1、转化成二进制数
2、把32位数字整体右移指定位数
3、左侧空位补充上指定位数个0
对于正数来说和有符号右移一致,负数不一致
示例:
25 >>> 2
25 = 0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0000 0110
console.log(25 >>> 2);
//输出6
-25 >>> 2
-25 = 1000 0000 0000 0000 0000 0000 0001 1001
0010 0000 0000 0000 0000 0000 0000 0110
console.log(-25 >>> 2);
//输出 1073741817