在C和C ++中按位AND运算符可传递的?

时间:2018-09-25 01:19:40

标签: c bitwise-operators

我有一个问题:按位和传递是可传递的,尤其是在C和C ++中吗?

res=(1 & 2 & 3 & 4),与res1=(1&2)res2=(3&4)相同,并且 res= (res1 & res2)。这会一样吗?

2 个答案:

答案 0 :(得分:5)

是的,按位AND在您使用术语时是可传递的。

将事物看作一堆堆的东西也许更容易。因此,如果我们有四个4位数字,则可以执行以下操作:

A = 0xB;
B = 0x3;
C = 0x1;
D = 0xf;

如果我们只是将它们堆叠起来:

A    1 0 1 1
B    0 0 1 1
C    0 0 0 1
D    1 1 1 1

然后,按位与的结果一次查看一列,并且当且仅当该列中的每一行都有1时,才为该列生成1,因此在上述情况下,我们得到: 1}},因为最后一列是全部。

如果我们将其分成两半以获得:

0 0 0 1

并且:

A    1 0 1 1
B    0 0 1 1
A&B  0 0 1 1

然后C 0 0 0 1 D 1 1 1 1 C&D 0 0 0 1 个中间结果:

and

我们的结果仍将是相同的-列中有零的任何地方,中间结果将产生零,最终结果将产生零。

答案 1 :(得分:4)

您要查找的术语是 associative 。通常,我们不会将二进制运算符称为“传递”。是的,默认情况下,&|都是关联的。显然,您可能会使运算符重载变得毫无意义,但是默认实现将是关联的。要查看这一点,请考虑一位值abc并注意

(a & b) & c == a & (b & c)

因为当且仅当所有三个输入均为1时,两者都将为1。这是对整数值的每个位逐点应用的操作。 |也是如此,只需将1替换为0

if your integers are signed还需要考虑一些问题,因为其行为取决于基础位表示。