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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:18:01