帮助我改进这个C++位缓冲区处理代码

4 c c++ bit-manipulation

我正在编写一个函数来处理传入的32位缓冲区,表示在与相应的存储32位缓冲区进行比较时更改数据.更改位的位置表示需要处理的数字(即,值8表示位3),以及更改是0-> 1还是1-> 0.这是目前的实施,请帮我改进一下!请注意,这不是实际代码,它已被简化为与上下文无关.

uint32_t temp = oldBuffer ^ newBuffer;
uint32_t number = 0;
while (temp != 0)
{
    if (temp & 0x1)
    {
        uint32_t bitValue = 0;
        if ((newBuffer& (1 << number)) != 0) bitValue = 1;
        processNumber(number, bitValue);
    }
    number++;
    temp = temp >> 1;
}
oldBuffer = newBuffer;
Run Code Online (Sandbox Code Playgroud)

现在它可以工作,但我不喜欢它必须检查每一位,检查位1并转移整个事情.如果有保证只有1位设置,这不会太难以弄清楚,但事实并非如此.

编辑:对于Neil,我想我希望找到一种方法来在恒定时间内获得XOR之后的位置,而不是一直移动缓冲区并逐个检查位.

Mic*_*ker 9

uint32_t temp=oldBuffer^newBuffer, ntemp=newBuffer;
for(int b=0;temp;++b,temp>>=1,ntemp>>=1)
    if(temp&1) processNumber(b,ntemp&1);
Run Code Online (Sandbox Code Playgroud)

  • +1,有些空间对提高可读性有很大帮助; D. (5认同)
  • 很好 - 一个(非常)小的东西:"b <32"的测试是不必要的.当`test`变为0时停止循环就足够了(如果编译器足够智能,可以在优化时计算出来). (3认同)