C 按位计算

C 按位计算,c,bit-manipulation,C,Bit Manipulation,对于以下示例代码: // Note that a, b, c and d can have value of 0 or 1 only int isAllTrue(int a, int b, int c, int d) { return (a && b && c && d); // THIS ALSO RETURNS CORRECT VALUE // return (a & b & c & d); } 如

对于以下示例代码:

// Note that a, b, c and d can have value of 0 or 1 only
int isAllTrue(int a, int b, int c, int d)
{
   return (a && b && c && d);

   // THIS ALSO RETURNS CORRECT VALUE
   // return (a & b & c & d);
}
如果我们知道操作数可以是0或1,那么从性能角度看,哪种操作更可取:按位操作还是逻辑操作?这真的重要吗


在按位计算的情况下&当操作数为0时,求值是否停止?

像这样的问题似乎有很多困惑。。。还有很多错误的答案。下面是C/C++的一些事实:

是逻辑运算符,用于测试 布尔表达式-整数值如果值不为零,则视为真,否则视为假- 无论您检查了多少个数字,但是0&&1都将被计算为false,例如,由于第一个0,它可能会被重新写入false&&true
&,|,~,^,>>,用于位操作。使用&&进行逻辑操作。如果您使用的是按位操作,而您应该使用逻辑操作,反之亦然,读者会感到困惑,请仔细检查您的代码是否引入了微妙的错误


编程依赖于习惯用法。如果您的代码与预期的习惯用法不匹配,那么您必须有一个很好的理由,并且您应该写一条注释来解释原因。

无论您使用哪种公式,对于主动编译器优化,所有显示的计算都应该在编译时完成


至于最后一个问题,位运算符不采用快捷方式求值,因此总是求值每个操作数。

可能重复:请查看答案。10&5&3=0,10&&5&&3=1,因此“按位”和“条件and”表达式不能互换。@DavidC.Rankin问题是询问已知操作数为0或1的情况。@t以标记为中心的堆栈溢出。不能使用其他语言的标记关闭重复项。因此,在未来,当建议以重复问题的形式结束时,请尊重这一点。对于使用所有零位表示整数0的每个实现,这个问题都是完全合理的,其中大部分是。事实上,唯一合理的例外可能是使用符号幅度表示的实现,但即使在这里,所示的声明也可能创建正0,这仍然是按位全零。因此,与其说OP已经理解了运算符类型之间的区别,为什么不检查边缘情况和/或位表示的微妙之处呢?在开始这样做之前,你真的需要知道数字在CPU内部是如何表示的——顺便说一句,你没有。您需要知道您使用的编程语言所建立的规则。硬件中的表示并不有趣,尽管它通常与编程语言的规则兼容。