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

C语言中如何将二进制连续多1转为0(限指定位运算操作符)

清除二进制中连续多位1的实现

需要实现一个函数,将整数x二进制形式中所有连续的多位1(即包含两个及以上1的连续位段)全部转为0,仅保留孤立的单个1。

问题规范

  • 允许使用的操作符:!、~、&、^、|、+、<<、>>(禁止使用循环、分支等控制结构)
  • 操作符最大使用次数限制:16

示例

  • cleanConsecutive1(0x10) = 0x10(二进制10000为孤立1,保留)
  • cleanConsecutive1(0xF0) = 0x0(二进制11110000为连续4个1,全部清除)
  • cleanConsecutive1(0xFFFF0001) = 0x1(高16位连续1清除,最低位孤立1保留)
  • cleanConsecutive1(0x4F4F4F4F) = 0x40404040(每个字节中连续3个1清除,保留最高位的孤立1)

当前尝试的问题

你提供的尝试代码逻辑存在错误,比如对于输入0x10,代码会输出0x18而非预期的0x10,其位运算组合无法正确区分孤立1和连续1。

正确实现方案

核心思路是先标记出所有属于连续多位1的位,再从原数中清除这些位:

  1. 计算mask = x & (x >> 1):结果中的1表示当前位与右侧相邻位均为1,即这些位属于连续1的一部分。
  2. 扩展标记范围:mask = mask | (mask << 1):将标记范围扩展到连续1的所有位(原标记的左邻位也属于连续1)。
  3. 保留孤立1:x & ~mask:清除所有被标记的连续1位,仅保留孤立的单个1。

代码实现

int cleanConsecutive1(int x) {
    int mask = x & (x >> 1);
    mask |= mask << 1;
    return x & ~mask;
}

操作符次数统计

  • x & (x >> 1):3次操作(>>、&)
  • mask |= mask << 1:3次操作(<<、|)
  • x & ~mask:2次操作(~、&)
    总计8次操作,远低于16次的限制。

内容的提问来源于stack exchange,提问作者jess

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:01:17