如何通过“查看”其二进制值的最后一位来检查 int 变量是偶数还是奇数?

tho*_*mas 0 c++ performance

如何通过查看变量的最后一位来检查存储在变量中的整数是偶数还是奇数?(我已经看到很多答案通过提醒进行模运算来确定它,但是,我的意思是,由于二进制数的最后一位数字可以是 0 xor 1,并且假设它是 0,则该数字是偶数,否则数字是奇数,直接看最后一位数字不是更快吗?)

Bat*_*eba 6

使用

bool even = !(x % 2);
Run Code Online (Sandbox Code Playgroud)

测试任何整数类型的均匀度x。您可以使用华而不实的异或技巧,但是您正在做编译器的工作,而不是您的工作。编译器会做出适当的优化。是的,XOR 通常是一个非常快的机器级指令,以至于您在查看生成的程序集时会看到 REG XOR REG 将 REG 设置为 0,而不是写入 0。

使用 XOR 的正确方法是写

bool even = (x & 1) ^ ((-1 & 1) | ((x < 0) ? 0 : 1));
Run Code Online (Sandbox Code Playgroud)

假设x是一种signed类型。任何其他方式,你都会假设一些关于 的补充方案x。在 C++20 之前,您不能假设 2 的补码。


Hol*_*Cat 6

假设由 C++20 保证的二进制补码(或无符号)数字,并且以前几乎无处不在:

bool even = !(x & 1);
Run Code Online (Sandbox Code Playgroud)