逻辑运算符与按位运算符的关键点是什么?

时间:2015-08-30 19:53:23

标签: c++ c bitwise-operators

鉴于此声明是逻辑操作

 ((a > 5) && (b > 4))

这句话是按位操作

   ((a > 5) & (b > 4)) 

以上两个陈述并不等同。

因为(a > 5){0,1}

的元素

那么,为什么我们需要logical operators & bitwise-operation

修改:感谢所有反馈。关于逻辑运算符的短路行为,我实际上不希望这种行为 - 我正在为GPU编写代码,其中分支会降低性能:短路导致两个分支而不是代码中的一个分支。

对于C中的数值比较,在不需要短路的情况下,似乎逻辑和按位具有相同的行为。在我的例子中,按位运算比逻辑运算更快。

我很抱歉没有将这些细节放在原始帖子中。

4 个答案:

答案 0 :(得分:5)

我想不,拿这个例子(0b - 表示二进制):

a = 0b00000010
b = 0b00000100

现在,ab都不是0.但是a & b == 0(由于按位AND的方式定义了)。

但是a && b != 0(因为如果至少有一个操作数为0,则逻辑AND结果为0 - 上述ab不是这种情况。)

还有短路评估,如果在&&左操作数为0,则不会评估正确的一个,因为结果肯定是0(例如,如已经提到0 && x == 0,无论{的值如何{1}})。

答案 1 :(得分:2)

  • 逻辑运算符在合并之前将其操作数转换为bool,逻辑运算符的结果也始终为bool。按位运算符不会这样做(但是如果操作数是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。

在您尝试的所有运营商中,他们都会提供&&10true。那是因为之间没有:没有表达式评估为“真实排序”或“可能是假”。

我认为按位运算符总是“产生”1或0的原因是非常自我解释的: -wise;一点是1或0。

答案 3 :(得分:1)

并非所有用作布尔值的表达式都评估为0或1;虽然0被视为false,但0以外的任何值都被视为true。因此,例如,1 && 2将为真,但1 & 2不会,即使1和2都被认为是真的。

另外,正如其他人所指出的那样,如果第一个表达式足以确定整体值('短路'),逻辑运算符将不会评估第二个表达式,这显然不能用按位版本(好吧,不是经常; 0 & ?无论什么都是0?是,因此?不需要进行评估以获得最终值,但是&没有&#39这样做。)