我在reddit上看到了这段代码
1 - ((num & 1) << 1) as i32
此代码为偶数返回1,为奇数返回-1。
它比其他计算相同事物的方法需要更少的指令,并且可能相当快。那么,它是如何工作的? (分步分析会有帮助)
注:我发现什么是最快的方法来发现如果一个数字是偶数或奇数?,但我也不明白这是怎么回事。
让我们从内到外分析一下。
num & 1
这"masks"除最不有效位外,其余位都使用按位和。因为最低有效位是"个位"。如果数为奇数,则求值为1
;如果数为偶数,则求值为0
。
(result1) << 1
这个位左移1。它的效果是乘以2。如果num
为奇数,则计算结果为2
,如果num
为偶数,则仍然为0
。(0 * 2 = 0)
(result2) as i32
这将得到的无符号整数(2
或0
)转换为有符号整数,允许我们在下一个操作中减去它。这只针对编译器,它对内存中的值没有影响。
1 - result3
从1
中减去前面的数字。如果num
是偶数,我们得到1 - 0
,结果是1
。如果num
是奇数,我们得到1 - 2
,结果是-1
。