leftshift和OR运算符是否可以在C中交换?

时间:2013-09-16 22:45:40

标签: c bit-manipulation

示例:

Operation 1:
d= c | y | z | a<<3 | b <<3 | x;

Operation 2:
m = c|y|z|x;
d = m | a<<3 | b<<3;

操作1和操作2在C中产生相同的结果吗?

2 个答案:

答案 0 :(得分:7)

要回答标题中的问题:

  

leftshift和OR运算符是否可以在C中交换?

|按位或运算符是可交换的,但<<运算符不是(a<<33<<a非常不同。)

但这似乎并不是你要问的问题。要回答问题的正文,由于<<的优先级高于|(即<<更紧密地绑定),您可以考虑a<<3和{{1}好像它们是主要或带括号的表达式。实际上,您有b<<3个运算符连接的多个子表达式。重新排列它们应该没有效果;您的两个代码段应该表现相同(除了第二个代码片段在|中存储一个值,这在第一个代码段中不存在。)

这假设您使用的所有变量属于同一类型。如果它们不存在,则将中间值存储在m中可能涉及可能会改变结果的转换。这可能不适用于您的情况,但由于您没有向我们展示任何声明,因此无法确定这一点。

答案 1 :(得分:3)

在这种情况下,它应该提供相同的结果,因为(a)没有副作用(例如内置前后增量或减量),以及(b){ {1}}运算符的优先级高于<<

因此,|操作将在<<操作之前进行。

这不是交换性问题,而是运营商之间的优先权问题。虽然它确实有助于|本身是可交换的,因为你的选择确实会改变表达式的组合顺序。