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

标签 c bit-manipulation bitwise-operators

我有一个与这里的问题非常相似的问题 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/

相关文章:

C char 数组、指针、malloc、free

在一行 C 中组合设置、清除和切换

bit-manipulation - 小数到整数的按位转换

c++ - 返回 0 数组的数组按位或异或

c++ - 在 Visual Studio 中的托管代码和非托管代码之间单步执行

C(嵌入式): Giving source file unique ID's

具有位变化的 PostgreSQL 按位运算符 "cannot AND bit strings of different sizes"

c - 一次反转数组中的两位

c - 仅使用 OR 和 AND 实现位移位

c - 调用 av_frame_get_buffer 时如何指定帧的线大小