二进制、高位低位、位移操作与进制转换全解

二进制、高位低位、位移操作与进制转换全解

在计算机科学中,理解高位与低位左移与右移进制转换位运算非常重要。这篇文章用清晰直观的方式梳理这些基本概念。

高位与低位

  • 低位:二进制中靠右的位,权值较小(例如 (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

二进制转八进制步骤

  1. 从右向左每三位分一组(不足补0)。
  2. 每组转为一个八进制数字。

例:1101011

  • 分组:001 101 011
  • 转换:1 5 3
  • 结果:153

八进制转二进制步骤

  1. 每个八进制数字转成对应的三位二进制数。

例: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. 将数据左移一位。
  2. 如果最高位是1,则将结果与多项式做异或。
  3. 重复步骤直到所有位处理完。

硬件中,CRC通常用移位寄存器实现;软件中,可以用查表法或直接位移法高效完成。

总结

掌握高位与低位概念,理解左移右移的本质,熟练进行二进制、八进制、十进制之间的转换,同时善用位运算,是搞定计算机底层原理、提高程序性能的重要基础。

相关推荐
Chloeis Syntax1 小时前
接10月12日---队列笔记
java·数据结构·笔记·队列
QT 小鲜肉1 小时前
【个人成长笔记】Qt 中 SkipEmptyParts 编译错误解决方案及版本兼容性指南
数据库·c++·笔记·qt·学习·学习方法
Cathy Bryant2 小时前
矩阵乘以向量?向量乘以向量?
笔记·神经网络·考研·机器学习·数学建模
递归不收敛3 小时前
Conda 常用命令汇总(新手入门笔记)
笔记·conda
前端橙一陈4 小时前
Salesforce Developer Edition(开发者版) 搭建测试环境
经验分享·笔记·其他
电子小子洋酱4 小时前
BearPi小熊派 鸿蒙入门开发笔记(4)
笔记·华为·harmonyos
摇滚侠4 小时前
Spring Boot 3零基础教程,WEB 开发 通过配置类代码方式修改静态资源配置 笔记32
java·spring boot·笔记
聪明的笨猪猪6 小时前
Java JVM “内存(1)”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
_dindong6 小时前
Linux网络编程:Socket编程TCP
linux·服务器·网络·笔记·学习·tcp/ip
摇滚侠7 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记