为什么需要不同的进制?
人类习惯十进制(Decimal),因为人有十根手指。但计算机使用二进制(Binary),因为电路只有通和断两种状态。八进制(Octal)和十六进制(Hexadecimal)是二进制的紧凑表示——每3位二进制对应1位八进制,每4位二进制对应1位十六进制。十六进制用0-9和A-F表示0-15,是编程中最常用的进制。理解进制转换是理解计算机工作原理的基础,也是网络编程、加密算法、图形处理等领域的必备知识。
各进制的常见前缀:二进制0b(如0b1010)、八进制0o或0(如0o12或012)、十六进制0x(如0xFF)、十进制无前缀。
进制转换的核心方法
所有进制转换都可以通过"除基取余"和"按权展开"两种方法实现:
任意进制转十进制(按权展开法):将每一位数字乘以基数的对应次幂,然后求和。例如,十六进制FF = 15×16¹ + 15×16⁰ = 240 + 15 = 255。二进制1010 = 1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 8 + 2 = 10。
十进制转任意进制(除基取余法):不断除以基数,记录余数,余数逆序排列即为结果。例如,255转十六进制:255÷16=15余15(F),15÷16=0余15(F),逆序得FF。
二进制与八进制/十六进制的快速转换:二进制转八进制,每3位一组(不足左补零),直接查表转换;二进制转十六进制,每4位一组,直接查表转换。这是最快的转换方法,因为8=2³,16=2⁴,存在天然的对应关系。
十六进制的特殊地位
十六进制在编程中无处不在,原因在于它与二进制的完美对应关系——1个十六进制位精确对应4个二进制位。这使得十六进制成为二进制数据的"人类可读"表示。常见应用场景:
- 颜色值:#FF8800中FF=255(红色)、88=136(绿色)、00=0(蓝色)
- 内存地址:0x7FFF5FBFF8A0,比二进制111111111111111110111111011111111111100010100000更简洁
- 网络协议:MAC地址00:1A:2B:3C:4D:5E,IPv6地址2001:0db8::1
- 字符编码:A表示字母A,中表示汉字"中"
- 权限掩码:0755(八进制,等价于0x1ED)
位运算:直接操作二进制
位运算是直接对二进制位进行操作的运算,在性能关键场景中不可或缺:
- AND(&):位与运算,常用于掩码操作。如value & 0xFF取低8位
- OR(|):位或运算,常用于设置标志位。如flags |= 0x01设置第0位
- XOR(^):位异或运算,相同为0不同为1。常用于简单加密、交换两个值(a^=b; b^=a; a^=b;)和找唯一数
- NOT(~):位取反,0变1,1变0。注意有符号数取反会包含符号位
- 左移(<<):所有位左移,右侧补0。相当于乘以2的n次方,如5 << 2 = 20
- 右移(>>):算术右移,左侧补符号位。相当于除以2的n次方取整
- 无符号右移(>>>):逻辑右移,左侧始终补0。JavaScript特有
位运算的实战技巧
位运算有许多巧妙的实战应用:判断奇偶——n & 1 === 0为偶数,比n % 2更快;交换两数——a ^= b; b ^= a; a ^= b;不需要临时变量;取整——n | 0或~~n等价于Math.floor(对正数);权限判断——用位掩码组合多个布尔标志;快速乘除2——左移1位等价于×2,右移1位等价于÷2;计算2的幂——1 << n得到2的n次方;求绝对值——(n ^ (n >> 31)) - (n >> 31)。
在现代JavaScript引擎中,部分位运算技巧的性能优势已被优化器抹平。但位掩码在组合标志、节省内存方面仍然不可替代。CSS的composite operation、Canvas的globalCompositeOperation、Node.js的文件权限等,都大量使用位掩码。
工具推荐
使用我们的在线数字进制转换工具,支持二进制、八进制、十进制、十六进制等多种进制互转,同步显示位运算结果,帮助你快速完成进制转换和位运算计算。