c++ - 你会使用 num%2 还是 num&1 来检查一个数字是否是偶数?

标签 c++ numbers readability low-level bitwise-operators

好吧,至少有两种低级方法可以确定给定数字是否为偶数:

 1. if (num%2 == 0) { /* even */ } 
 2. if ((num&1) == 0) { /* even */ }

我认为第二种选择更加优雅和有意义,这是我经常使用的一种。但这不仅仅是品味问题。实际性能可能会有所不同:通常按位运算(例如这里的逻辑与)比 mod(或 div)运算效率更高。当然,你可能会争辩说有些编译器无论如何都可以优化它,我同意……但有些不会。

另一点是,对于经验不足的程序员来说,第二个可能有点难以理解。我会回答说,如果这些程序员花这么短的时间来理解这种陈述,它可能只会使每个人受益。

你怎么看?

仅当 num 是无符号整数或带有二进制补码表示的负数时,给定的两个片段才是正确的。 - 正如一些评论所说的那样。

最佳答案

我首先为可读性编写代码,所以我在这里的选择是 num % 2 == 0。这比 num & 1 == 0 要清楚得多。我会让编译器担心为我优化,并且只有在分析显示这是一个瓶颈时才进行调整。其他任何事情都为时过早。

I consider the second option to be far more elegant and meaningful

我强烈反对这一点。一个数字是偶数是因为它的模二的同余性为零,而不是因为它的二进制表示以某个位结尾。二进制表示是一个实现细节。依赖实现细节通常是一种代码味道。正如其他人所指出的,在使用反码表示的机器上测试 LSB 会失败。

Another point is that the second one might be a little harder to comprehend for less experienced programmers. On that I'd answer that it will probably only benefit everybody if these programmers take that short time to understand statements of this kind.

我不同意。我们都应该编码以使我们的意图更清晰。如果我们正在测试均匀性,代码应该表达出来(并且注释应该是不必要的)。同样,测试模 2 的一致性比检查 LSB 更清楚地表达了代码的意图。

而且,更重要的是,细节应该隐藏在 isEven 方法中。所以我们应该看到 if(isEven(someNumber)) {//details } 并且在 isEvennum % 2 == 0 一次.

关于c++ - 你会使用 num%2 还是 num&1 来检查一个数字是否是偶数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1949271/

相关文章:

javascript - 如何限制1-10 0 auto 生成JavaScript中的一个数字

java - 完美的数字

c++ - 新 (std::nothrow) 与 try/catch block 中的新

c++ - 无法为指向类的指针数组创建访问方法

c++ - 如何将 QTableWidget 添加到 QTreeWidget 中,但作为 QTreeWidgetItem

Java检测 float 是正数还是负数

c - 如何通过错误处理和调试减少 C 中的代码膨胀

C++ 静态类成员 - 语法错误

c++ - 找出名称修饰