位操作:将公共部分保持在最后一个不同位的左侧

Vin*_*ent 5 c c++ algorithm optimization bit-manipulation

考虑用二进制编写的两个数字(左边是MSB):

X = x7 x6 x5 x4 x3 x2 x1 x0
Run Code Online (Sandbox Code Playgroud)

Y = y7 y6 y5 y4 y3 y2 y1 y0
Run Code Online (Sandbox Code Playgroud)

这些数字可以具有任意数量的位,但两者的类型相同.现在考虑x7 == y7,x6 == y6,x5 == y5,但x4 != y4.

如何计算:

Z = x7 x6 x5 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

或换句话说,如何有效地计算一个数字,使公共部分保持在最后一个不同位的左边?

template <typename T>
inline T f(const T x, const T y) 
{
    // Something here
}
Run Code Online (Sandbox Code Playgroud)

例如,对于:

x = 10100101
y = 10110010
Run Code Online (Sandbox Code Playgroud)

它应该回来

z = 10100000
Run Code Online (Sandbox Code Playgroud)

注意:它用于超级计算,此操作将执行数十亿次,因此应该避免逐个扫描位...

Ego*_*off 6

我的答案基于@JerryCoffin的答案.

int d = x ^ y;
d = d | (d >> 1);
d = d | (d >> 2);
d = d | (d >> 4);
d = d | (d >> 8);
d = d | (d >> 16);
int z = x & (~d);
Run Code Online (Sandbox Code Playgroud)

  • @Tomas - 现代CPU独立于移位计数器在恒定时间内执行位移. (2认同)