在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它。作为一位编程人员,这些都是基础知识。如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难。本文你将会学习到:
进制转换
按位操作符
Javascript进制转换
手动实现进制转换
进制转换以下使用常见的十进制和二进制转换作为例子,其他进制的转换也是大同小异,感兴趣可以自己琢磨下。
十进制转二进制根据 “逢十进一” 的法则进行计数时,每十个相同的单位组成一个和它相邻的较高的单位,这种计数法叫做十进制计数法,简称十进制。这种是我们最常用的计数法。
整数整数使用 “除二取余,逆序排列” 来转换为二进制,下面是18转换为二进制的例子:
// 除二取余 18 / 2 = 9...0 9 / 2 = 4...1 4 / 2 = 2...0 2 / 2 = 1...0 1 / 2 = 0...1 // 倒序排列 10010就这么简单,将得出的余数逆序排列,即可得出18的二进制表示
小数小数使用的是 “乘二取整,顺序排列”,由于方法不同需要分开计算。下面是16.125转为二进制的例子:
16 / 2 = 8...0 8 / 2 = 4...0 4 / 2 = 2...0 2 / 2 = 1...0 1 / 2 = 0...1 0.125 * 2 = 0.25 0.25 * 2 = 0.5 0.5 * 2 = 1 10000.001将小数相乘的结果,取结果的整数顺序排列,得出小数位的二进制表示
二进制转十进制根据 “逢二进一 ” 的法则进行计数时,每两个相同的单位组成一个和它相邻的较高的单位,这种计数法叫做二进制计数 法,简称二进制。用二进制计数时,只需用两个独立的符号“0”和“1” 来表示。
整数整数使用 “按权相加” 法,即二进制数首先写成加权系数展开式,然后按十进制加法规则求和。下面是101010转换位十进制的例子:
2^5 2^4 2^3 2^2 2^1 2^0 1 0 1 0 1 0 ------------------------ 32 + 0 + 8 + 0 + 2 + 0 = 42上面从右数依次是2的0次方,2的1次方,2的2次方... , 只取位数为1的结果,将它们相加就可以得到十进制。
小数10110.11转十进制:
2^4 2^3 2^2 2^1 2^0 2^-1 2^-2 1 0 1 1 0 . 1 1 ------------------------------- 16 + 0 + 4 + 2 + 0 + 0.5 + 0.25 = 22.75 按位操作符按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),前 31 位表示整数的数值,第 32 位表示整数的符号,0 表示正数,1 表示负数。例如,十进制数18,用二进制表示则为10010。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。
按位与( AND)对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。
用法: a & b 。
9 (base 10) = 00000000000000000000000000001001 (base 2) 14 (base 10) = 00000000000000000000000000001110 (base 2) -------------------------------- 14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)在判断一个数字奇偶时,可以使用 a & 1
function assert(n) { return n & 1 ? "奇数" : "偶数" } assert(3) // 奇数因为奇数的二进制最后一位是1,而1的二进制最后一位也是1,通过 & 操作符得出结果为1
按位或(OR)对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。
用法: a | b
9 (base 10) = 00000000000000000000000000001001 (base 2) 14 (base 10) = 00000000000000000000000000001110 (base 2) -------------------------------- 14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10)将浮点数向下取整转为整数,可以使用 a | 0
12.1 | 0 // 12 12.9 | 0 // 12 按位异或(XOR)对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。
用法: a ^ b
9 (base 10) = 00000000000000000000000000001001 (base 2) 14 (base 10) = 00000000000000000000000000001110 (base 2) -------------------------------- 14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10) 按位非(NOT)反转操作数的比特位,即0变成1,1变成0。
用法: ~ a
9 (base 10) = 00000000000000000000000000001001 (base 2) -------------------------------- ~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)通过两次反转操作,可将浮点数向下取整转为整数
~~16.125 // 16 ~~16.725 // 16 左移(Left shift)将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。
用法: a << b
9 (base 10): 00000000000000000000000000001001 (base 2) -------------------------------- 9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)左移一位相当于在原数字基础上乘2,利用这一特点,实现2的n次方:
function power(n) { return 1 << n } power(3) // 8 有符号右移将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位。
用法: a >> b
9 (base 10): 00000000000000000000000000001001 (base 2) -------------------------------- 9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)