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的位,再从原数中清除这些位:
- 计算
mask = x & (x >> 1):结果中的1表示当前位与右侧相邻位均为1,即这些位属于连续1的一部分。 - 扩展标记范围:
mask = mask | (mask << 1):将标记范围扩展到连续1的所有位(原标记的左邻位也属于连续1)。 - 保留孤立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
相关产品推荐
相关产品推荐

