BitVector位域设置:64位BitVector替换8至15位的高效实现方法
64位BitVector指定位段替换的最高效实现方案
最高效的实现完全基于CPU原生支持的位运算,全程无循环、无分支,时间复杂度为O(1),所有操作均可在单时钟周期内完成。
注:以下方案默认位索引从0开始计数(最低位为第0位),如果是从1开始计数的使用场景,只需对应调整偏移量即可。
具体操作步骤
- 第一步:构造目标位段的清除掩码:将8位全1的数值左移8位后整体取反,得到除第8~15位为0、其余所有位为1的64位掩码:
~(0xFFULL << 8) - 第二步:清除原BitVector的目标位段:将原BitVector与清除掩码做按位与操作,擦除第8~15位的原有值,其余位保持不变
- 第三步:对齐新值:将待替换的新值先与
0xFF做按位与(确保新值只有8位有效,避免溢出污染其他位),再左移8位对齐到目标位段的位置 - 第四步:合并结果:将清除后的原BitVector与对齐后的新值做按位或操作,完成位段替换
代码示例(C语言)
#include <stdint.h> // 替换64位BitVector的第8~15位 uint64_t replace_8to15_bits(uint64_t original_vec, uint8_t new_segment_val) { // 构造清除掩码,使用ULL后缀避免32位符号扩展问题 const uint64_t clear_mask = ~(0xFFULL << 8); // 清除目标位段后合并新值 return (original_vec & clear_mask) | ((uint64_t)(new_segment_val & 0xFF) << 8); }
通用扩展(适配任意位段)
如果需要替换任意起始位置、任意长度的位段,可使用通用公式:
设位段长度为n,起始偏移为start(从0开始计数):
- 清除掩码:
~(((1ULL << n) - 1) << start) - 对齐后的新值:
((new_val & ((1ULL << n) - 1)) << start)
内容的提问来源于stack exchange,提问作者Leandro Caniglia
相关产品推荐
相关产品推荐

