You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:36:02