&的含义在C ++中

时间:2013-09-09 08:25:49

标签: c++ bitwise-operators

我对在某些C ++代码中找到的表达式感到困惑:

if (m & 1)
pmm=-pmm;

我不是C / C ++编码器,所以Google给了我两件事:

  1. &安培;是按位AND
  2. if语法为if (condition) statement
  3. 那么,上述陈述如何运作? 我不需要if ((m & 1)==0)吗?

3 个答案:

答案 0 :(得分:2)

只是为了添加更多技术性解释,更简单的查看if (m & 1)的方法是测试m是否奇数(即不是2的精确倍数) :

if (m & 1)
    // m is odd (1, 3, 5, 7, 9, ...) - do something
else
    // m is even (0, 2, 4, 6, 8, ...) - do something else

答案 1 :(得分:2)

m 将在内存中表示为二进制数,换句话说:一系列位。 值 1 也将表示为一系列位。

例如(为简单起见,我选择了8位长度):

m = 00101101
1 = 00000001

m 执行按位操作将执行您指定的操作,在这种情况下& (AND)在每个二进制数上相同位置的每个位上& 符号的任一侧。

即。结果的第1位= m&的第1位值1的第1位。 结果的第2位= m&的第2位值1的位2等...

因此,对于我们的例子:

  00101101
& 00000001
 ---------
  00000001

假设 m 是一个整数,则按位运算将返回一个整数。 if 语句将检查结果是否为真,并且因为它是一个整数,如果非零则将被解释为true。

结果不为零,因此在我们的示例中它将返回true。

所以: 通过 AND - 一个带1的整数,你最终会在代码中为奇数返回true,因为对于奇数,第1位总是1。

答案 2 :(得分:1)

这是按位AND运算符。 m&如果设置了位0,则1的计算结果为1,并且每个非0的表达式都是 true

以下是等效表达式:

if ((m & 1) == 1) // bitwise AND is 1
if ((m & 1) != 0) // bitwise AND is NOT 0
if (m & 1)

但是,如果测试更多位,则需要谨慎。例如,m = 1:

if (m & 3)也是true,但结果是1。在这种情况下,if ((m & 3) == 3)更好。