javascript 进制转换方法
区别 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。
以上 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