数学与软件工程

二进制

高位低位

  描述二进制数位位置权重的基本概念,对理解计算机数据表示和位运算至关重要;

一、基本定义

  • 低位(LSB, Least Significant Bit):指二进制数中右边的位,其权值最小(2⁰=1)。在字节中,低位通常指第0位。
  • 高位(MSB, Most Significant Bit):指二进制数中左边的位,其权值最大(2ⁿ⁻¹,n为位数)。在字节中,高位通常指第7位。

二、权值与示例

在二进制系统中,位的位置决定其权重,从右向左依次递增:
  • 低位:权值为2⁰ = 1
  • 次低位:权值为2¹ = 2
  • 次高位:权值为2⁶ = 64
  • 高位:权值为2⁷ = 128(8位二进制数中)

三、在编程中的应用

1. 位运算

  • 提取低位:使用位与运算 x & 1 可获取最低位值
  • 提取高位:使用右移运算 x >> 7(8位数)可获取最高位值
  • 设置位值:通过位或运算设置特定位为1,如 x | 0b10000000 设置最高位

2. 字节顺序(Endianness)

  • 大端模式(Big-Endian)高位字节存储在低地址,低位字节存储在高地址
  • 小端模式(Little-Endian)低位字节存储在低地址,高位字节存储在高地址
例如,16位数0x1234在内存中的存储:
  • 大端模式:低地址→0x12、高地址→0x34
  • 小端模式:低地址→0x34、高地址→0x12

3.位移操作

  • 左移(<<):将所有位向左移动,低位补0,相当于乘以2ⁿ
  • 右移(>>):将所有位向右移动,高位补符号位,相当于除以2ⁿ

4.补码表示

在计算机中,负数通常用补码表示:
  • 正数5:00000101
  • 负数-5:先取反11111010,再加1得11111011

为什么2的幂次方数据能实现均匀分布

  核心原因在于其二进制特性使取模运算可转化为位运算,确保哈希值的每一位都能参与索引计算,避免数据倾斜

一、位运算与取模运算的等价性

当容量为2的幂次方(如8、16、32)时,取模运算可完全等价于位运算
  • hash % 8 等价于 hash & 7(7的二进制为0111)
  • hash % 16 等价于 hash & 15(15的二进制为01111)
  • 一般形式:hash % 2^n 等价于 hash & (2^n - 1)
这种等价性成立的关键在于:2的幂次方减1的二进制表示中所有低位都是1,这使得位运算能精确捕获哈希值的低位信息
 

二、均匀分布的数学原理

2的幂次方能保证数据均匀分布的根本原因
  1. 哈希值的每一位都参与计算
    • 当容量为2的幂次方时,hash & (length - 1)会使用哈希值的所有低位来计算索引
    • 例如:容量为16(2⁴)时,hash & 15使用哈希值的最后4位,确保0-15范围内所有索引都有可能被选中
  2. 避免数据倾斜
    • 若容量不是2的幂次方(如9),会出现"空洞"现象:
      • 3 & 8 = 02 & 8 = 0,导致多个值映射到同一索引
      • 3 & 7 = 32 & 7 = 2,能保持值的分散性
    • 实验表明,使用2的幂次方分库时,各库数据量误差可控制在5%以内,而非2的幂次方可能导致某些库数据量超标50%以上
  3. 二进制特性保障
    • 2的幂次方的二进制表示为"1后面n个0"(如16=10000)
    • 2的幂次方减1的二进制表示为"n个1"(如15=01111)
    • 这种特性确保了哈希值的低位变化能均匀映射到所有可能的索引位置

三、实际应用价值

HashMap和分库分表场景中,2的幂次方设计带来三大核心优势:
  1. 性能提升
    • 位运算比取模运算快10-100倍,尤其在高并发场景下效果显著
    • 例如:在设备中心服务中,64*4的分片结构使查询效率提升3-5倍
  2. 扩容简便性
    • 从64库扩到128库时,仅需迁移50%的数据
    • 元素在扩容后的新位置要么保持不变,要么移动到"原位置+旧容量"处
    • 避免了全量数据重新计算和迁移的开销35
  3. 资源优化
    • 64个库(2⁶)可确保设备ID哈希后均匀分布在所有库
    • 每个库4个表(2²)进一步分散单库压力,避免热点问题
    • 这种设计在硬件成本、运维复杂度和性能提升之间取得了最佳平衡

 

 

posted on 2025-12-31 14:07  anpeiyong  阅读(0)  评论(0)    收藏  举报

导航