二进制、高位低位、位移操作与进制转换全解
在计算机科学中,理解高位与低位 、左移与右移 、进制转换 与位运算非常重要。这篇文章用清晰直观的方式梳理这些基本概念。
高位与低位
- 低位:二进制中靠右的位,权值较小(例如 (2^0, 2^1))。
- 高位:二进制中靠左的位,权值较大(例如 (2^7, 2^8))。
示例:在 1101
中,最左边的 1
是高位,对应 (2^3),最右边的 1
是低位,对应 (2^0)。
左移 (<<
) 与右移 (>>
)
操作 | 效果 | 补位 |
---|---|---|
左移 << |
所有位向左移动,低位补0 | 数值×2 |
右移 >> |
所有位向右移动,高位补符号位 | 数值/2(正数) |
小例子:
0011 << 1 = 0110
(3 左移变 6)1100 >> 1 = 0110
(12 右移变 6)
二进制与八进制的关系
三位二进制正好可以对应一个八进制数字,因为 (2^3=8)。
三位二进制 | 八进制 |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
二进制转八进制步骤
- 从右向左每三位分一组(不足补0)。
- 每组转为一个八进制数字。
例:1101011
- 分组:
001
101
011
- 转换:1 5 3
- 结果:
153
八进制转二进制步骤
- 每个八进制数字转成对应的三位二进制数。
例:153
1 -> 001
5 -> 101
3 -> 011
- 结果:
1101011
十进制与二、八进制转换
十进制转二进制
- 除2取余,倒序排列。
例:13 → 1101
二进制转十进制
- 每个位×2的对应幂次,结果相加。
例:1101
→ 13
十进制转八进制
- 除8取余,倒序排列。
例:83 → 123
八进制转十进制
- 每个位×8的对应幂次,结果相加。
例:123
→ 83
位运算速查
运算符 | 名称 | 规则 | 示例 |
---|---|---|---|
& |
位与 | 都为1结果才为1 | 1010 & 1100 = 1000 |
` | ` | 位或 | 有1结果为1 |
^ |
位异或 | 不同为1,相同为0 | 1010 ^ 1100 = 0110 |
~ |
位非 | 取反 | ~1010 = 0101 |
<< |
左移 | 乘以2 | 0011 << 1 = 0110 |
>> |
右移 | 除以2(正数) | 1100 >> 1 = 0110 |
补码表示和符号扩展
补码表示
- 正数:最高位是0,直接按原码存储。
- 负数:最高位是1,用补码存储:原码取反加一。
例:
+5
(8位)=00000101
-5
(8位)=11111011
符号扩展
当把较小的数据类型扩展到较大的类型时:
- 无符号数:高位补0。
- 有符号数:根据最高位补0或1,保持正负性不变。
例:
8位 -5 (11111011)
扩展为16位 -5 (11111111 11111011)
大端序与小端序
大端序(Big-Endian)
- 高位字节排在前面,低位字节排在后面。
- 常见于网络协议。
小端序(Little-Endian)
- 低位字节排在前面,高位字节排在后面。
- 常见于x86架构计算机。
例:32位整数 0x12345678
- 大端:12 34 56 78
- 小端:78 56 34 12
高效位操作技巧
快速乘除2
n << 1
等同于n × 2
n >> 1
等同于n ÷ 2
(正数)
判断奇偶性
n & 1
:- 结果是1,奇数;
- 结果是0,偶数。
取绝对值(有符号数)
一种位操作绝对值写法:
c
int abs(int n) {
int mask = n >> 31;
return (n + mask) ^ mask;
}
解释:
n >> 31
:得到全0(正)或全1(负)。- 正数不变,负数反码加一,即取绝对值。
位图和位集合优化技巧
- 使用一位(bit)来表示一个元素的存在与否,大大节省内存。
- 比如要表示100万个元素是否出现,只需要约125KB内存,而不是100万个bool变量。
- 常用操作:
- 置位 :
bitmap[index/8] |= (1 << (index%8))
- 清位 :
bitmap[index/8] &= ~(1 << (index%8))
- 查询 :
bitmap[index/8] & (1 << (index%8))
- 置位 :
应用场景:去重、布隆过滤器、集合运算优化。
CRC校验与位操作
- CRC(循环冗余校验)用于数据传输或存储时检测错误。
- 核心是通过位移和异或操作不断处理数据位。
简单示意:
- 将数据左移一位。
- 如果最高位是1,则将结果与多项式做异或。
- 重复步骤直到所有位处理完。
硬件中,CRC通常用移位寄存器实现;软件中,可以用查表法或直接位移法高效完成。
总结
掌握高位与低位概念,理解左移右移的本质,熟练进行二进制、八进制、十进制之间的转换,同时善用位运算,是搞定计算机底层原理、提高程序性能的重要基础。