C 中的按位双条件 - 产品总和不起作用

bitwise biconditional in C - sum of products not working

为什么两个代码片段都没有在 C 中实现双条件功能?

int x = !!((a & b) | (~a & ~b))

int x = !!(!!(a & b) | !!(~a & ~b))

但是,以下工作:!((a & ~b) | (~a & b))

要反驳前两个断言,一个简单的反例就足够了:

a=0, b=1int x = !!((a & b) | (~a & ~b)) 中变为:

  • int x = !!((0 & 1) | (~0 & ~1));
  • int x = !!(0 | ~1);
  • int x = !!~1;
  • int x = 1; -> 不正确

如果 !! 不是按位运算符,此表达式的问题。当且仅当 a == b 时,表达式 ((a & b) | (~a & ~b)) 设置所有位,但 !! 不适合测试此条件。您应该改为使用 int x = !~((a & b) | (~a & ~b));

a=0, b=1int x = !!(!!(a & b) | !!(~a & ~b)) 变成:

  • int x = !!(!!(0 & 1) | !!(~0 & ~1));
  • int x = !!(!!(0) | !!(~1));
  • int x = !!(0 | 1);
  • int x = !!(1);
  • int x = 1; -> 不正确

同样,问题是 !!。此处分别应用于(a & b)(~a & ~b),取消所有并行位比较的希望。

对于第三个表达式:((a & ~b) | (~a & b)) 将结果中的每一位设置为 1,如果对应的位是(0 in a1b) 或(1a0b)。换句话说,当且仅当 ab 中的相应位不同时,结果中的每一位都设置为 1。如果结果中的所有位都是 0,那么 a 中的所有位都与 b 中的相同位相同,因此 ab 是相同的。 QED.

这里的假设是 ab 当且仅当它们的所有位都相同时才相等。对于所有现代计算机使用的 2 的补码表示都是如此,但对于使用 1 的补码或 sign/magnitude 表示的古代奇异机器则不然。

对于这些怪人,只有 0 有 2 种可能的表示,但可以找到 ab 的值,表达式 ((a & ~b) | (~a & b)) 的计算结果为另一种表示0 虽然 ab 不同。

  • 1-1是sign/magnitude表示的反例。
  • 1-2 是 ones 补码表示的反例。