c++ - 按位操作的问题

标签 c++ c 64-bit bit-manipulation

好的,伙计们,我知道我想做什么,但我不知道它是否已经存在(作为一个函数或理论上)或如何表达它,所以我需要你的帮助:

  • 假设我们有一个二进制数:(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/

相关文章:

c++ - 在 C++11 中将 fstream 引用作为函数参数传递

c++ - 从 C++ 中的函数返回动态分配的缓冲区的最佳模式是什么?

c - fft2 (matlab) 和 fftw (C) 的不同结果

c - 如何使用c编程在重启后保留值

windows - 32 位与 64 位 Windows 版本上的进程大小和行为差异

c++ - Visual Studio 中的 gcc -Wall -pedantic -Wextra

c++ - 模板类中静态成员的延迟初始化

c - 如何从控制台读取未知数量的整数?

delphi - 如何在Delphi中定义 "UCHAR * POINTER_32"和 "VOID * POINTER_32"类型?

ruby - 无法编译 ruby​​ 扩展 : CPU you selected does not support x86-64 instruction set