如何用无循环无分支位操作高效检测64位无符号整数任意位含0b11111模式
64位无符号整数连续5个全1位无分支检测实现
判定规则与实现约束
- 核心判定逻辑:给定任意64位无符号整数,只要其在任意起始位偏移上存在连续5个全1位(允许跨固定位分组边界),即判定为有效;若所有位置的连续全1位最长不超过4个,即判定为无效。
- 检测场景覆盖范围:连续5个1出现在位偏移0、1、2、4等任意位置,甚至多段连续5个1同时存在的情况,均需正确识别。
- 实现硬约束:检测全程不能使用循环、分支语句,仅通过算术、逻辑、位操作完成单次校验,最大化运行效率。
现有方案的局限性
- 此前参考固定分块的零块检测思路,尝试将目标模式(连续5个1)取反为全0块做对齐检测,但该方法仅能识别按5位长度对齐划分的固定区间(如bit0-4、bit5-9这类整段对齐的5位块),完全无法覆盖跨分组的任意偏移连续5个1场景,例如连续5个1从bit1开始(覆盖bit1-5)的情况会直接漏检。
无分支检测实现方案
核心原理
通过多次移位后按位与的方式,将所有可能的连续5个1的模式统一映射为可直接检测的置位标记,全程无分支、无循环:
对输入值x依次构造移位序列,再做连续按位与:
// C语言实现,输入为64位无符号整数 uint64_t detection_result = x & (x >> 1) & (x >> 2) & (x >> 3) & (x >> 4);
该表达式的数学含义为:
- 结果的第i位为1,等价于原数
x的第i、i+1、i+2、i+3、i+4位全部为1,也就是从i位开始存在一组连续5个全1位。 - 只要
detection_result为非零值,就说明存在至少一组符合要求的连续5个1,完全覆盖所有可能的起始偏移位置,不存在固定分块的漏检问题。
方案特性
- 检测范围完全覆盖所有位偏移的连续5个1场景,无边界遗漏。
- 全流程仅包含4次逻辑右移、4次按位与操作,无循环、无分支,指令数固定,执行效率远高于循环逐位检测或固定分块检测方案。
验证用例
- 输入值为
0b11111(bit0开始的连续5个1):计算结果为非零值,判定有效。 - 输入值为
0b111110(bit1开始的连续5个1):计算结果为非零值,判定有效。 - 输入值为
0b1111(最长4个连续1):计算结果为0,判定无效。 - 输入值为跨32位边界的连续6个1段:计算结果为非零值,判定有效。
内容的提问来源于stack exchange,提问作者szvarga
相关产品推荐
相关产品推荐

