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

X = x7 x6 x5 x4 x3 x2 x1 x0


Y = y7 y6 y5 y4 y3 y2 y1 y0

这些数字可以具有任意数量的位,但是两者的类型相同。现在考虑x7 == y7x6 == y6x5 == y5,但是x4 != y4

如何计算:
Z = x7 x6 x5 0 0 0 0 0

或者换句话说,如何有效地计算将公共(public)部分保留在最后一个不同位的左侧的数字?
template <typename T>
inline T f(const T x, const T y)
{
    // Something here
}

例如,用于:
x = 10100101
y = 10110010

它应该返回
z = 10100000

注意:这是出于 super 计算目的,此操作将执行数千亿次,因此应避免逐位扫描...

最佳答案

我的答案基于@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);

08-16 01:52