我目前正在剖析 ol' Doom 引擎源代码,并遇到了一条有趣的线:
counter = (++counter)&(MAX_VALUE-1);
看起来是一种在不超过某个数字的情况下增加计数器的方法,但是我在脑海中进行按位运算时遇到了棘手的时间,所以我快速启动了一个控制台项目来尝试这个,你瞧,它有效漂亮地。我推断上述方法比 if() 语句更有效,特别是如果代码快速执行时,例如,在循环中,实时游戏中的性能至关重要。我想弄清楚的是编译器用来执行这一行的操作顺序。如果增量“++”运算符放在“计数器”之后,它将始终保持为零。它仅在增量用作前缀(“++counter”)时才有效,但即便如此,如果我用笔和纸写出来,我会得到按位 AND 运算的任意结果,而不是递增的计数器。似乎计算了按位运算,然后执行了递增,但我很难弄清楚为什么,有什么想法吗?
最佳答案
虽然括号中有更高的precedence比运算符++
或按位AND
(运算符&
),没有定义sequence points在你的右手边。所以你的代码表现出未定义的行为。
如果你删除运算符++
,这意味着
(counter + 1)&(MAX_VALUE-1);
如果您将 MAX_VALUE
视为 32
,则二进制形式的 MAX_VALUE-1
为
11111
因此,如果您的值大于该值并使用 &
,第 5 位(从右边开始)左边的任何位都将被清除
0000011111 // assume this is MAX_VALUE - 1
1100110110 // assume this is counter + 1
__________
0000010110
如果任何小于或等于 MAX_VALUE - 1
的位为 1
,则结果将为 true
。
关于c++ - C/C++ 中的按位与和运算顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080714/