我正在尝试找到满足这个不等式的最大1 << n
(所有变量都是正整数):
a & ~((1 << n) - 1) >= b
迭代地解决这个问题是微不足道的(是的,我知道你可以通过分而治之等获得更好的表现),但这不是我的问题。
我想知道是否有一种方法可以解决直接,就像通过某种程度的纠缠一样?
注1: 假设您可以在一次操作中“向上/向下舍入到最接近2的幂”。 注意2: 如果有必要,您可以假设两个补码表示(但我怀疑这有帮助)。
如果有直接的方式,我可以使用什么技术来解决这个问题?如果没有,我能以某种方式说出来吗?
我尝试了许多事情,比如XORing a
和b
,将结果四舍五入到下一个2的幂,等等。但我最终找不到任何总是有效的东西
答案 0 :(得分:3)
if (a < b) {
oops();
} else if (a == b) {
return ctz(a);
} else {
// most significant mismatching bit - must be set to 1 in a and 0 in b
int msmb = round_down_to_power_of_2(a ^ b);
if (b & (msmb - 1)) {
return ctz(msmb);
} else {
return ctz(b);
}
}
我们有4个案例: