C语言判断数值含指定二进制模式功能单1位匹配错误问题咨询
问题原因定位
- 代码的第一个循环
while ((pattern & 1) == 0) pattern >>= 1;直接丢弃了pattern末尾的所有0位,丢失了pattern的原始二进制长度信息。比如传入的pattern是4(二进制100),经过这个循环后会变成1(二进制1),后续匹配的时候只会判断是否存在1位的1,而不是原本3位的100,这是错误的核心原因。 - 原有逻辑只适用于pattern最低位为1的场景,没有保留pattern的原始有效位数,当pattern末尾带0时自然匹配逻辑完全失效。
修正方案
需要先计算pattern的二进制有效总长度(包括末尾的0),再生成对应长度的掩码,然后逐位滑动比对,修正后的代码如下:
int check_pattern(int value, int pattern) { // pattern为0的边界情况可根据需求调整返回值 if (pattern == 0) return 0; // 计算pattern的二进制有效长度 int len = 0; int tmp = pattern; while (tmp) { len++; tmp >>= 1; } // 生成对应长度的全1掩码 int mask = (1 << len) - 1; // 剩余value长度够匹配时才继续比对 while (value >= (1 << (len-1))) { if ((value & mask) == pattern) { return 1; } value >>= 1; } return 0; }
测试验证
用你出错的测试用例测试:values = {10, 11, 12, 13}, patterns = {4,8,4,2}
输出结果和你预期一致:
1: 10 contains pattern 4? False 2: 11 contains pattern 8? False 3: 12 contains pattern 4? False 4: 13 contains pattern 2? False
同时原有的正确测试用例结果保持不变。
优化建议
- 可以增加对负数的处理逻辑,当前代码默认传入的value和pattern都是非负整数,如果需要支持负数,建议先转换为无符号整数再处理,避免算术右移带来的符号位问题。
- 可以提前判断pattern的二进制长度大于value的情况,直接返回0,减少不必要的循环。
内容的提问来源于stack exchange,提问作者ARainyCloud
相关产品推荐
相关产品推荐

