和在C++的含义

meaning of & in C++

本文关键字:C++ 和在      更新时间:2023-10-16

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

if (m & 1)
pmm=-pmm;

我不是C/C++程序员,所以Google给了我两件事:

  1. 并且是按位和
  2. if语法if (condition) statement

那么,上述说法是如何运作的呢?我不应该要求if ((m & 1)==0)吗?

为了补充更多的技术解释,一种更简单的查看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

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。

所以:通过用 1 与整数进行 AND-运算,您最终只会在代码中为奇数返回 true,因为对于奇数,位 1 始终为 1。

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

以下是等效表达式:

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)更好。