考虑用二进制写的两个数字(左侧的MSB):
X = x7 x6 x5 x4 x3 x2 x1 x0
和
Y = y7 y6 y5 y4 y3 y2 y1 y0
这些数字可以具有任意数量的位,但是两者的类型相同。现在考虑
x7 == y7
,x6 == y6
,x5 == 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);