我对在一些 C++ 代码中找到的表达式有点困惑:
if (m & 1)
pmm=-pmm;
我不是 C/C++ 编码员,所以 Google 给了我两件事:
- & 是按位与
if
语法是if (condition) statement
那么,上面的语句是如何工作的呢?我不应该要求一个if ((m & 1)==0)
吗?
我对在一些 C++ 代码中找到的表达式有点困惑:
if (m & 1)
pmm=-pmm;
我不是 C/C++ 编码员,所以 Google 给了我两件事:
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。
因此:通过AND -ing 与 1 的整数,您最终将在代码中仅对奇数返回 true,因为对于奇数,位 1 始终为 1。
这是按位与运算符。如果设置了位 0 并且每个不是 0 的表达式都隐含地为真,则 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)
在这种情况下更好。