JavaScript 进制问题

712 阅读3分钟

这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战

JavaScript 进制

JavaScript当中,最经常使用的进制计算方法是十进制,这也是我们平时生活中计算方式。

不过在平时的使用过程中,JavaScript还可以使用其他进制方式来进行计算。对于非十进制之外的数据,通常会在数值前面使用0x、0o、0b等方式来标识。

二进制

在JavaScript中可以编写二进制数据,二进制前的标识是0b,es6中引入了原生二进制字面量。

二进制(binary)是在数学和数字电路中指以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示

例子:十进制中的15可以显示为二进制的1111

console.log(0b1111);  // 15

二进制转十进制正常使用即可,十进制转二进制可以使用toSting()方法。不过这样转换出的结果其实是字符串类型。

let num = 15;
console.log(num.toString(2));  // 1111

八进制

八进制前需要加标识0o或者0,这两种都可以

console.log(015);  // 13
console.log(0o15);  // 13

十进制转八进制

let num = 13;
console.log(num.toString(8));  // 15

十六进制

十六进制前的标识是0x

console.log(0x11);  // 17 

十进制转十六进制

let num = 17;
console.log(num.toString(16));  // 11

当然对于进制转换方法平时自己也可以写一下,就当是练习:

下面的toBaseSystem方法是十进制转换成二进制、八进制、十六进制的方法。

第一个参数是十进制的数值,第二个参数是需要转换的进制。在转换十六进制时需要注意,十六进制会出现a-f的数值

function toBaseSystem(num:number, flag:number){
    if (num == 0) return '0';
    let arr:(number|string)[] = [];
    while(num > 0){
        let n:number|string = num%flag;
        if (n == 0) {
            arr.unshift(0)
        } else {
            if (n >= 10) {
                switch (n) {
                    case 10: n = 'a'; break;
                    case 11: n = 'b'; break;
                    case 12: n = 'c'; break;
                    case 13: n = 'd'; break;
                    case 14: n = 'e'; break;
                    case 15: n = 'f'; break;
                }
            } 
            arr.unshift(n)
        }
        num = Math.floor(num/flag);
    }
    return arr.join('');
}

测试结果:

console.log(toBaseSystem(100, 2));  // 1100100
console.log(toBaseSystem(100, 8));  // 144
console.log(toBaseSystem(100, 16)); // 64

与或非

对于二进制,其实还存在与或非操作,

& 与

&按位与会将操作数和被操作数的相同为进行与运算,如果都为1则为1,如果有一个为0则为0

比如:1010111001 相与结果是 10001

image.png

let num = (0b10101 & 0b11001);
console.log(num.toString(2));  // 10001

| 或

按位或 是相同的位置上只要有一个为1就是1,两个都为0则为0

比如:1010111001 或结果是 11101

image.png

let num = (0b10101 | 0b11001);
console.log(num.toString(2));

~ 非

~操作符会将操作数的每一位取反,如果是1则变为0,如果是0则边为1

10101的或运输结果是-10110,好像有些不对。

这是因为数值是有正负的,需要使用最高位的符号

所以运算过程是这样的:

image.png

let num = (~0b10101);
console.log(num.toString(2));