JavaScript 常用的进制显示与转换

进制表示

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,得到的结果正确
本文收录于专栏
记录 JavaScript 刷题时用到的一些语法、代码片段、工具、经验等