我有一个问题:按位和传递是可传递的,尤其是在C和C ++中吗?
说res=(1 & 2 & 3 & 4)
,与res1=(1&2)
和res2=(3&4)
相同,并且
res= (res1 & res2)
。这会一样吗?
答案 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 。通常,我们不会将二进制运算符称为“传递”。是的,默认情况下,&
和|
都是关联的。显然,您可能会使运算符重载变得毫无意义,但是默认实现将是关联的。要查看这一点,请考虑一位值a
,b
和c
并注意
(a & b) & c == a & (b & c)
因为当且仅当所有三个输入均为1
时,两者都将为1
。这是对整数值的每个位逐点应用的操作。 |
也是如此,只需将1
替换为0
。
if your integers are signed还需要考虑一些问题,因为其行为取决于基础位表示。