鉴于此声明是逻辑操作
((a > 5) && (b > 4))
这句话是按位操作
((a > 5) & (b > 4))
以上两个陈述并不等同。
因为(a > 5)
是{0,1}
那么,为什么我们需要logical operators & bitwise-operation
?
修改:感谢所有反馈。关于逻辑运算符的短路行为,我实际上不希望这种行为 - 我正在为GPU编写代码,其中分支会降低性能:短路导致两个分支而不是代码中的一个分支。
对于C中的数值比较,在不需要短路的情况下,似乎逻辑和按位具有相同的行为。在我的例子中,按位运算比逻辑运算更快。
我很抱歉没有将这些细节放在原始帖子中。
答案 0 :(得分:5)
我想不,拿这个例子(0b - 表示二进制):
a = 0b00000010
b = 0b00000100
现在,a
和b
都不是0.但是a & b == 0
(由于按位AND的方式定义了)。
但是a && b != 0
(因为如果至少有一个操作数为0,则逻辑AND结果为0 - 上述a
和b
不是这种情况。)
还有短路评估,如果在&&
左操作数为0,则不会评估正确的一个,因为结果肯定是0(例如,如已经提到0 && x == 0
,无论{的值如何{1}})。
答案 1 :(得分:2)
bool
,逻辑运算符的结果也始终为bool
。按位运算符不会这样做(但是如果操作数是bool,那么这两种运算符之间没有区别。)&&
的情况下,这意味着:如果第一个操作数为假,则第二个操作数甚至不被评估,因为整个表达式(false&& something)已经为假,无论其值如何第二个操作数。逻辑快捷方式运算符通常在以下情况下被利用:
// If mypointer is NULL, then mypointer->is_whatever()
// isn't evaluated so it doesn't cause a NULL pointer crash.
if (mypointer && mypointer->is_whatever()) {
// do my thing
}
答案 2 :(得分:1)
逻辑运算符用于比较多个值的真实性。
例如,您使用x
运算符来查看两个值是否都是&&
。
逐位运算符用于隔离和修改值中的位。
例如,为了关闭除8之外的8位值中的所有位,您可以这样做:
true
在上面的例子中,第6位(从1开始)或第5位(从0开始)保持原样,其他位被关闭。
两种类型的运算符都相似,因为它们都产生0或1。
例如,请执行以下操作:
val & 00100000
上述内容会产生1 || 0
,因为其中任何一个值都等于1
。但是,如果我们将运算符切换到1
,它将产生0。
在您尝试的所有运营商中,他们都会提供&&
或1
,0
或true
。那是因为之间没有:没有表达式评估为“真实排序”或“可能是假”。
我认为按位运算符总是“产生”1或0的原因是非常自我解释的:位 -wise;一点是1或0。
答案 3 :(得分:1)
并非所有用作布尔值的表达式都评估为0或1;虽然0被视为false,但0以外的任何值都被视为true。因此,例如,1 && 2
将为真,但1 & 2
不会,即使1和2都被认为是真的。
另外,正如其他人所指出的那样,如果第一个表达式足以确定整体值('短路'),逻辑运算符将不会评估第二个表达式,这显然不能用按位版本(好吧,不是经常; 0 & ?
无论什么都是0?是,因此?不需要进行评估以获得最终值,但是&
没有&#39这样做。)