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=1
在 int 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=1
在 int 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 a
和 1
在 b
) 或(1
在 a
和 0
在 b
)。换句话说,当且仅当 a
和 b
中的相应位不同时,结果中的每一位都设置为 1
。如果结果中的所有位都是 0
,那么 a
中的所有位都与 b
中的相同位相同,因此 a
和 b
是相同的。 QED.
这里的假设是 a
和 b
当且仅当它们的所有位都相同时才相等。对于所有现代计算机使用的 2 的补码表示都是如此,但对于使用 1 的补码或 sign/magnitude 表示的古代奇异机器则不然。
对于这些怪人,只有 0
有 2 种可能的表示,但可以找到 a
和 b
的值,表达式 ((a & ~b) | (~a & b))
的计算结果为另一种表示0
虽然 a
和 b
不同。
1
和-1
是sign/magnitude表示的反例。
1
和 -2
是 ones 补码表示的反例。
为什么两个代码片段都没有在 C 中实现双条件功能?
int x = !!((a & b) | (~a & ~b))
或
int x = !!(!!(a & b) | !!(~a & ~b))
但是,以下工作:!((a & ~b) | (~a & b))
要反驳前两个断言,一个简单的反例就足够了:
a=0, b=1
在 int 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=1
在 int 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 a
和 1
在 b
) 或(1
在 a
和 0
在 b
)。换句话说,当且仅当 a
和 b
中的相应位不同时,结果中的每一位都设置为 1
。如果结果中的所有位都是 0
,那么 a
中的所有位都与 b
中的相同位相同,因此 a
和 b
是相同的。 QED.
这里的假设是 a
和 b
当且仅当它们的所有位都相同时才相等。对于所有现代计算机使用的 2 的补码表示都是如此,但对于使用 1 的补码或 sign/magnitude 表示的古代奇异机器则不然。
对于这些怪人,只有 0
有 2 种可能的表示,但可以找到 a
和 b
的值,表达式 ((a & ~b) | (~a & b))
的计算结果为另一种表示0
虽然 a
和 b
不同。
1
和-1
是sign/magnitude表示的反例。1
和-2
是 ones 补码表示的反例。