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

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

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

高位与低位

  • 低位:二进制中靠右的位,权值较小(例如 (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通常用移位寄存器实现;软件中,可以用查表法或直接位移法高效完成。

总结

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

相关推荐
全是操作1 小时前
安卓学习笔记-数据存储
android·笔记·学习
珊瑚里的鱼1 小时前
第十讲 | 继承
开发语言·c++·笔记·visualstudio·学习方法·visual studio
Timmer丿2 小时前
kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)
java·笔记·学习·kafka
LeeAmos12 小时前
CTA-861-G-2017中文pdf版
笔记
s_little_monster3 小时前
【Linux】网络--传输层--深入理解TCP协议
linux·运维·经验分享·笔记·网络协议·学习·tcp/ip
小葡萄20254 小时前
黑马程序员C++核心编程笔记--4 类和对象--封装
java·c++·笔记
Always_away12 小时前
26考研|高等代数:λ-矩阵
笔记·学习·线性代数·矩阵
图梓灵13 小时前
Maven与Spring核心技术解析:构建管理、依赖注入与应用实践
java·笔记·spring·maven
寻丶幽风14 小时前
论文阅读笔记——Step1X-Edit: A Practical Framework for General Image Editing
论文阅读·人工智能·笔记·多模态·理解生成模型
野木香14 小时前
idea使用笔记
java·笔记·intellij-idea