我正在编写一个函数来处理传入的 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;
现在它可以工作,但我不喜欢它必须通过检查位 1 并移动整个内容来检查每一位。如果保证只设置 1 位,那不难弄清楚,但事实并非如此。
编辑:对于 Neil,我想我希望找到一种方法来在常数时间内获得 XOR 之后的位的位置,而不是一路移动通过缓冲区并一个一个地检查位。
最佳答案
uint32_t temp=oldBuffer^newBuffer, ntemp=newBuffer; for(int b=0;temp;++b,temp>>=1,ntemp>>=1) if(temp&1) processNumber(b,ntemp&1);
关于c++ - 帮我改进这个 C++ 位缓冲处理代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307527/