这个代码如何检查一个数字的奇偶校验?(偶数或奇数)



我在reddit上看到了这段代码

1 - ((num & 1) << 1) as i32

此代码为偶数返回1,为奇数返回-1。

它比其他计算相同事物的方法需要更少的指令,并且可能相当快。那么,它是如何工作的? (分步分析会有帮助)

注:我发现什么是最快的方法来发现如果一个数字是偶数或奇数?,但我也不明白这是怎么回事。

让我们从内到外分析一下。

  1. num & 1

这"masks"除最不有效位外,其余位都使用按位和。因为最低有效位是"个位"。如果数为奇数,则求值为1;如果数为偶数,则求值为0

  1. (result1) << 1

这个位左移1。它的效果是乘以2。如果num为奇数,则计算结果为2,如果num为偶数,则仍然为0。(0 * 2 = 0)

  1. (result2) as i32

这将得到的无符号整数(20)转换为有符号整数,允许我们在下一个操作中减去它。这只针对编译器,它对内存中的值没有影响。

  1. 1 - result3

1中减去前面的数字。如果num是偶数,我们得到1 - 0,结果是1。如果num是奇数,我们得到1 - 2,结果是-1

最新更新