进制表示
let a = 0b10100; //二进制
let b = 0o24; //八进制
let c = 20; //十进制
let d = 0x14; //十六进制
console.log(a == b);
console.log(b == c);
console.log(c == d);
进制转换
10 进制转任意进制 10 进制数.toString(目标进制)
console.log(c.toString(2));
任意进制转十进制 parseInt('任意进制字符串', 原始进制);
console.log(parseInt("10100", 2));
不支持显示与使用符号位
js 计算时使用的是四字节的整型,即跟 C 语言的 int 类似。包括使用“取反”这个位运算的时候,得到的结果都是跟 C 语言 int 一致的。如: ~147
得到 -148
。另外,也有 >>>
这个无符号右移运算符。
但进制的表示与转换,不支持负数符号位显示,都会把数当做正整数处理。如果是进制转化,会在前面加一个负号。
比如 C 处理 printf("%X\n", -14);
得到 fffffff2
,包含符号位;
JS 处理 console.log((-14).toString(2));
却得到 -1110
, 即 14 的二进制 1110
前面加了负号。
写一个整数转化完整二进制表示的方法
由于运算时,js 的整数是有符号 32 位整数。遍历 32 次,求得每个位置显示的值,即可得到数值的完整的二进制表示。
每个位置显示的值:把该位移到最右 (num >> i
) 后,与 000...0001
进行与运算 (前面都是0,所以都会返回0,得到最右位置的值,看看它是 0 还是 1)。
function toBin(num){
let s = ''
for(let i = 0; i < 32; i++) {
s = String(num >> i & 1) + s
}
return s;
}
- toBin(10) 得到 00000000000000000000000000001010
- toBin(-10) 得到 11111111111111111111111111110110
- -10 的二进制,正好是 10 的反码加 1,得到的结果正确