Jeeeeeeeeen

javascript 进制转换方法

June 11, 2015 | 1 Minute Read

区别 toString 和 parseInt

在javascript中使用 Number的 toString 方法把 相应的数值 转换为 特定radix ( 默认值 10) 的进制。【注意返回的是字符串】

numObj.toString([radix])

而 parseInt(string, radix) 则是以 radix( 默认值 10) 的进制 解析 string,并返回 十进制的数值。

如果省略参数radix或其值为 0,则数字将以 10 为基础来解析。 如果它以 “0x” 或 “0X” 开头,将以 16 为基数。 如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

来自 JavaScript parseInt() 函数

以上 radix 的值范围是: 2~36。若不在此区间,那么 以上俩个方法都会抛出异常。

//numObj.toString([radix]) 
var a = 123; // 或 new Number(123)

a.toString(10);  // 等到(包含十进制的)字符串: "123"  
a.toString(8);   // 等到(包含八进制的)字符串: "173"
a.toString(2);   // 等到(包含二进制的)字符串: "1111011"
a.toString(16);  // 等到(包含十六进制的)字符串: "7b"

// parseInt(string, radix)

// 等价于 将 十进制进制数值 123 解析为 十进制
parseInt("123",10); // 等到十进制数值: 123

// 等价于 将 八进制数值 123 解析为 十进制
parseInt("123",8);  // 等到十进制数值: 83

// 等价于 将 二进制数值 123 解析为 十进制
// 但是只有字符串中的第一个数字会被返回。因为只有第一个数字符合二进制。
// 如果要转换的第一位非空字符 不符合 相应的进制,就会抛出异常。
parseInt("123",2);  // 等到十进制数值: 1

// 等价于 将 十六进制数值 123 解析为 十进制
parseInt("123",16); // 等到十进制数值: 291

负数的原码、反码、补码

正整数是不变的(原码、反码、补码相等)。根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.

原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

[-127 , 127]

反码

对原码取反 ,等到反码。反码只是作为中间数,为求得补码。(反码就是将除符号位外取反)

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

补码

对反码加 1。

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

计算机存储的是补码,这是非常有利的,所以机器可以只有加法而没有减法。例如 十进制 8-3 =5;在计算机是这样的,8+(-5): 十进制8的二进制为: 0000 1000,整数的补码也一样;而-5的补码为: 1111 1011;两个补码相加得到: 0000 0011 即为 3.

字节(byte)、字(word)、双字(dword)、四字(qword)

8个位(bit)称为一个字节(byte),两个字节称为一个字(Word),两个字称为一个双字(dword),两个双字称为一个四字(qword)

  • 一个字节 有八位二进制: 1 byte = 8 bit
  • 一个字 有两个字节: 1 word = 2 byte
  • 一个双字 有两个字: 1 dword = 2 word
  • 一个四字 有两个双字: 1 qword = 2 dword