在C和C+中是按位和运算符传递的+;? 我有一个问题:位传递是传递的,特别是在C和C++中?

在C和C+中是按位和运算符传递的+;? 我有一个问题:位传递是传递的,特别是在C和C++中?,c,bitwise-operators,C,Bitwise Operators,假设res=(1&2&3&4),这与res1=(1&2)和res2=(3&4)相同吗 res=(res1和res2)。这是一样的吗?您要查找的术语是关联的。我们通常不会将二进制运算符称为“可传递的”。是的,&和|在默认情况下都是关联的。显然,可以将运算符重载为无意义的内容,但默认实现将是关联的。要查看这个,请考虑一个位值 a >代码> b>代码>和 c>代码>并注意 (a & b) & c == a & (b & c) 因为当且仅当所有三个输入均为1时,两者都

假设
res=(1&2&3&4)
,这与
res1=(1&2)
res2=(3&4)
相同吗
res=(res1和res2)
。这是一样的吗?

您要查找的术语是关联的。我们通常不会将二进制运算符称为“可传递的”。是的,
&
|
在默认情况下都是关联的。显然,可以将运算符重载为无意义的内容,但默认实现将是关联的。要查看这个,请考虑一个位值<代码> a <代码> >代码> b>代码>和<代码> c>代码>并注意

(a & b) & c == a & (b & c)
因为当且仅当所有三个输入均为
1
时,两者都将为
1
。这是一个逐点应用于整数值中每一位的运算。
|
也是如此,只需将
1
替换为
0


也有一些问题需要考虑,因为行为依赖于底层的比特表示。

你要找的术语是关联的。我们通常不会将二进制运算符称为“可传递的”。是的,

&
|
在默认情况下都是关联的。显然,可以将运算符重载为无意义的内容,但默认实现将是关联的。要查看这个,请考虑一个位值<代码> a <代码> >代码> b>代码>和<代码> c>代码>并注意

(a & b) & c == a & (b & c)
因为当且仅当所有三个输入均为
1
时,两者都将为
1
。这是一个逐点应用于整数值中每一位的运算。
|
也是如此,只需将
1
替换为
0


也有一些问题需要考虑,因为行为依赖于底层的比特表示。

是的,按位和传递的是你使用的术语。

把事情看作一堆比特可能更容易。因此,如果我们有四个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
然后按位AND的结果一次查看一列,并为该列生成一个1,当且仅当该列中的每一行都有一个1,因此在上面的例子中,我们得到:
0 0 0 1
,因为最后一列是唯一一个全为1的列

如果我们将其一分为二,得到:

A    1 0 1 1
B    0 0 1 1
A&B  0 0 1 1
以及:

然后,
这些中间结果:

A&B 0 0 1 1 
C&D 0 0 0 1
End 0 0 0 1

我们的结果仍然是一样的——只要列中有一个零,中间结果就会产生一个零,最终结果就会产生一个零。

是的,按位传递,就像你使用的术语一样

把事情看作一堆比特可能更容易。因此,如果我们有四个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
然后按位AND的结果一次查看一列,并为该列生成一个1,当且仅当该列中的每一行都有一个1,因此在上面的例子中,我们得到:
0 0 0 1
,因为最后一列是唯一一个全为1的列

如果我们将其一分为二,得到:

A    1 0 1 1
B    0 0 1 1
A&B  0 0 1 1
以及:

然后,
这些中间结果:

A&B 0 0 1 1 
C&D 0 0 0 1
End 0 0 0 1

我们的结果仍然是一样的——在一个列中有一个零,在中间结果中会产生一个零,在最终结果中会产生一个零。

当然,如果你把结果转换成一个布尔值,你可以考虑<代码>和<代码>来定义一个关系,例如<代码>(x和4)…< /代码>。那么该关系肯定不会是可传递的,例如,
1和3
转换为true,
3和2
转换为true,但
1和2
转换为false。(这与经典的非传递关系是同构的,例如A和B有一个共同的兴趣。)当然,如果你把结果转换成一个布尔值,你可以考虑<代码>和<代码>来定义一个关系,例如<代码>(x和4)…< /代码>。那么该关系肯定不会是可传递的,例如,
1和3
转换为true,
3和2
转换为true,但
1和2
转换为false。(这与经典的非传递关系同构,例如“A和B有共同的兴趣”。)注意,没有C/C++。由于这两种语言的共同祖先,它们之间存在一些重叠,这就是C/C++的意思,但这并不能描述一种语言,这种重叠随着语言的发展和分化而逐渐缩小。在这种情况下,C和C++对你的问题的答案一致。但是没有C/C++,C++不是C和C的扩展,不是C++的子集。它们是不同的语言。@FrançoisAndrieux目前在meta上有一个关于交叉标记C和C++的公开讨论:请注意,在C语言中,有很多隐式类型提升都在幕后进行。这可能会产生各种各样的意外副作用,例如改变信号。特别是在使用位运算符时。通过拆分表达式,您可能会得到不同的结果,具体取决于所涉及的变量类型。@Lundin感谢链接,有趣的阅读。尽管我的评论是专门针对术语“C/C++”的。我不得不不同意这个编辑。不清楚Raj是问C++还是两种语言,如果问两个问题,问题就没问题了。至少,由于标题特别要求C++,我们可以假定它不是严格的C。所以我编辑了这个问题来反映。无论如何,它使这个问题对未来的读者更有用,能够接触到更广泛的读者。@Lundin我似乎错过了讨论的一部分。我不完全同意,但是我已经删除了C++标签,我不添加任何脚趾。注意没有C/C++。由于它们的共同祖先,这两种语言之间有一些重叠,这就是C/C++的意思,