使用给定的按位运算符重现函数
Using given bitwise operators to reproduce function
我有一个问题与这里的问题非常相似 ,但是坦率地说这个问题措辞不佳(所以我不确定它们有多相似)并且答案没有太多解释。
正在尝试复制此功能:
int testdl4(int x) {
int i;
for (i = 1; i < 32; i+=2)
if ((x & (1<<i)) == 0)
return 0;
return 1;
}
仅使用这些按位运算符:!、~、&、^、|、+、<< 和 >>(意味着没有循环或 if 语句)。
上述 link 的答案(我想是同一个问题,但循环从 0 开始)是:
return !((x & 0x55555555) ^ 0x55555555);
而且我认为需要更改掩码才能使其正常工作,但我不确定 2 是什么。
有人可以解决并解释推理吗?
让我们先用英语写下您的代码的实际作用:
If any odd numbered bit (from 1 to 31) is clear return 0; otherwise return 1.
现在“any odd numbered bit (from 1 to 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);
}
我有一个问题与这里的问题非常相似
正在尝试复制此功能:
int testdl4(int x) {
int i;
for (i = 1; i < 32; i+=2)
if ((x & (1<<i)) == 0)
return 0;
return 1;
}
仅使用这些按位运算符:!、~、&、^、|、+、<< 和 >>(意味着没有循环或 if 语句)。
上述 link 的答案(我想是同一个问题,但循环从 0 开始)是:
return !((x & 0x55555555) ^ 0x55555555);
而且我认为需要更改掩码才能使其正常工作,但我不确定 2 是什么。
有人可以解决并解释推理吗?
让我们先用英语写下您的代码的实际作用:
If any odd numbered bit (from 1 to 31) is clear return 0; otherwise return 1.
现在“any odd numbered bit (from 1 to 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);
}