You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
  • 左移一位 << 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:36:32