我有一个与这里的问题非常相似的问题 Checking bits of ints to see if they share binary with the power of 2 (bitwise only) ,但是坦率地说,这个问题的措辞很糟糕(所以我不确定它们有多相似),并且答案没有得到太多解释。
尝试复制此功能:
int testdl4(int x) {
int i;
for (i = 1; i < 32; i+=2)
if ((x & (1<<i)) == 0)
return 0;
return 1;
}
仅使用这些按位运算符:!、~、&、^、|、+、<< 和 >>(意味着没有循环或 if 语句)。
上述链接的答案(我认为是同样的问题,但循环从 0 开始)是:
返回!((x & 0x55555555) ^ 0x55555555);
我相信需要更换 mask 才能使其发挥作用,但我不确定 2 是什么。
有人可以解决并解释推理吗?
最佳答案
让我们首先用英语编写代码的实际功能:
If any odd numbered bit (from 1 to 31) is clear return 0; otherwise return 1.
现在“任何奇数位(从1到31)
”是二进制值10101010101010101010101010101010b,即0xAAAAAAAAUL
。请注意,此值对于有符号 32 位整数来说是不可能的,因此我们希望使用至少 32 位的无符号整数。
如果任何位被清除,则x & 0xAAAAAAAAUL
将不等于0xAAAAAAAAUL
。
这给出了:
int testdl4(unsigned long x) {
if( (x & 0xAAAAAAAAUL) != 0xAAAAAAAAUL) {
return 0;
}
return 1;
}
请注意,这确实包含一个 if
以获得与原始代码相同的行为(例如返回 1
并且不返回困惑的非零值)。
但是,逻辑 NOT !
将强制非零值变为零,零值变为 1;所以你可以这样做:
int testdl4(unsigned long x) {
return !((x & 0xAAAAAAAAUL) ^ 0xAAAAAAAAUL);
}
关于c - 使用给定的按位运算符来重现函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58677632/