写点什么

JavaScript 进制问题

作者:空城机
  • 2021 年 11 月 11 日
  • 本文字数:1323 字

    阅读完需:约 4 分钟

JavaScript 进制问题

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);  // 13console.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));  // 1100100console.log(toBaseSystem(100, 8));  // 144console.log(toBaseSystem(100, 16)); // 64
复制代码



与或非

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

& 与

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


比如:1010111001 相与结果是 10001


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

| 或

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


比如:1010111001 或结果是 11101


let num = (0b10101 | 0b11001);console.log(num.toString(2));
复制代码

~ 非

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


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


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


let num = (~0b10101);console.log(num.toString(2));
复制代码


发布于: 2021 年 11 月 11 日阅读数: 5
用户头像

空城机

关注

曾经沧海难为水,只是当时已惘然 2021.03.22 加入

业余作者,在线水文 主要干前端的活,业余会学学python 欢迎各位关注,互相学习,互相进步

评论

发布
暂无评论
JavaScript 进制问题