C语言不用模运算判断奇偶:移位操作表达式含义解析
C语言不使用模运算符判断奇偶的方法及移位表达式解析
判断整数奇偶性的核心逻辑是看其二进制最后一位:偶数的二进制最后一位为0,奇数则为1(偶数是2的整数倍,二进制中仅高位有有效位,末位必然是0)。基于这个原理,不用模运算符%也能实现判断,以下是两种实用方法:
1. 位与运算(最常用)
利用位与&的特性:任何整数和1做位与运算,只会保留该数的二进制最后一位。若结果为0,说明原数是偶数;结果为1则是奇数。代码示例:
if ((number & 1) == 0) { // 偶数处理逻辑 } else { // 奇数处理逻辑 }
2. 移位运算解析:(number >> 1) << 1 == number
这个表达式通过两次移位操作验证原数是否为偶数,具体拆解如下:
- 右移一位
number >> 1:将整数的二进制位整体右移一位,直接丢弃最右侧的末位。比如:- 偶数6(二进制
110)右移一位后变为3(二进制11) - 奇数7(二进制
111)右移一位后同样变为3(二进制11)
- 偶数6(二进制
- 左移一位
<< 1:将右移后的结果再左移一位,会在二进制末尾补一个0。比如3(11)左移一位后变为6(110) - 对比原数:
- 若原数是偶数,右移时丢掉的是末位的0,左移补0后得到的数和原数完全一致(如6→3→6),等式成立。
- 若原数是奇数,右移时丢掉的是末位的1,左移补0后末位变为0,得到的数比原数小1(如7→3→6≠7),等式不成立。
因此,当(number >> 1) << 1 == number成立时,原数必然是偶数。
完整代码示例
#include <stdio.h> int main() { int num; printf("输入一个整数:"); scanf("%d", &num); // 移位运算判断 if ((num >> 1) << 1 == num) { printf("%d 是偶数\n", num); } else { printf("%d 是奇数\n", num); } // 位与运算判断 if ((num & 1) == 0) { printf("%d 是偶数(位与判断)\n", num); } else { printf("%d 是奇数(位与判断)\n", num); } return 0; }
注:移位运算的理论效率高于模运算,因为位操作是CPU原生支持的底层指令。不过现代编译器会自动将number % 2这类运算优化为位与操作,实际性能差异并不明显,但这类方法能帮助你更深入理解二进制数的本质。
内容的提问来源于stack exchange,提问作者Ashika
相关产品推荐
相关产品推荐

