好的,伙计们,我知道我想做什么,但我不知道它是否已经存在(作为一个函数或理论上)或如何表达它,所以我需要你的帮助:
- 假设我们有一个二进制数:(msb)
10101110
(lsb) - 从位 X 开始,我想在遇到第一个零位时立即将所有其他位清零(向左)。
- 尽可能快速,以绝对最少的操作次数和所需的 CPU 周期
一个例子:
- 编号 = 10101110,起始位置 = 1(位置 1 的位 = 1)
- position++ - 位在位置 2 = 1,继续前进
- position++ - 位在位置 3 = 1,继续前进
- position++ - bit at place 4 = 0,糟糕...遇到零...现在,所有内容都必须归零。
因此,我们虚构的函数 CROPLEFT(X,POS) 的最终结果(其中 X=10101110,POS=1)将返回 00001110
。
有什么想法吗?
最佳答案
小菜一碟。
y = ~x; // We like working with 1's, not 0's.
y &= -y; // Mask off all but the lowest-set bit
x &= y-1; // Make a mask for the bits below that and apply it.
并添加位置参数:
y = ~x & -1U<<pos; // Change 1U to a larger type if needed.
y &= -y;
x &= y-1;
关键要素是第二行,您可以通过应用逻辑和 -y
将值 y
替换为其最低设置位。可悲的是,获得最高位就没有这样的运气,除非你有一个特殊的 cpu 指令,所以你很幸运你的问题需要最低位。
关于c++ - 按位操作的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13889541/