这是我参与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
比如:10101 和 11001 相与结果是 10001
let num = (0b10101 & 0b11001);
console.log(num.toString(2)); // 10001
| 或
按位或 是相同的位置上只要有一个为1就是1,两个都为0则为0
比如:10101 和 11001 或结果是 11101
let num = (0b10101 | 0b11001);
console.log(num.toString(2));
~ 非
~操作符会将操作数的每一位取反,如果是1则变为0,如果是0则边为1
10101的或运输结果是-10110,好像有些不对。
这是因为数值是有正负的,需要使用最高位的符号
所以运算过程是这样的:
let num = (~0b10101);
console.log(num.toString(2));