使用给定的按位运算符重现函数

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);
}