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

求助:C语言中如何按指定步骤对整数特定位执行XOR操作

实现步骤详解与代码示例

核心思路

要完成你需要的操作,核心是位运算的提取、移位和异或,下面分步骤拆解实现,所有操作基于32位unsigned int(C语言中常见的无符号整型长度)。


步骤1:提取最左侧4位

对于32位unsigned int,最左侧4位是最高的4位(对应bit28~bit31,从0开始计数,最右侧为bit0)。可以通过右移操作将这4位移到最低位,从而提取出来:

unsigned int num = 7;
// 提取最高4位:将num右移28位,原最高4位会移动到最低4位,其余位被丢弃
unsigned int top4 = num >> (sizeof(unsigned int) * 8 - 4);
  • sizeof(unsigned int)*8:计算无符号整型的总位数(32位环境下结果为32),减去4后得到需要右移的位数(28),这样写可以适配不同位数的平台。
  • 示例中num=7的二进制是0000 0000 0000 0000 0000 0000 0000 0111,右移28位后top4的值为0(二进制0000)。

步骤2:执行左移4位

直接使用左移运算符<<即可,注意可以直接修改原变量或用临时变量保存结果:

// 将num左移4位,等价于乘以16
num <<= 4;
// 或者用临时变量保存:unsigned int shifted_num = num << 4;
  • 示例中num=7左移4位后,二进制变为0000 0000 0000 0000 0000 0000 0111 0000,十进制值为112。

步骤3:目标位与提取的4位做XOR

首先需要将提取的top4移动到第17~20位的位置(这里默认位编号从0开始,即第17位对应bit17,第20位对应bit20),然后和左移后的num执行异或操作:

// 将top4移动到bit17~bit20的位置:左移17位
unsigned int top4_shifted = top4 << 17;
// 执行异或操作,修改num的第17~20位
num ^= top4_shifted;
  • 异或(^)的特性是:对应位相同则结果为0,不同则为1,刚好实现"用提取的4位翻转目标位"的需求。
  • 示例中top4=0,左移17位后还是0,异或后num的值保持112不变,符合预期。

完整代码示例

#include <stdio.h>

int main() {
    unsigned int num = 7;
    printf("初始值:%u,二进制:0x%08X\n", num, num);

    // 步骤1:提取最左侧4位
    unsigned int top4 = num >> (sizeof(unsigned int) * 8 - 4);
    printf("提取的最高4位:%u,二进制:0x%01X\n", top4, top4);

    // 步骤2:左移4位
    num <<= 4;
    printf("左移4位后:%u,二进制:0x%08X\n", num, num);

    // 步骤3:第17~20位与提取的4位异或
    unsigned int top4_shifted = top4 << 17;
    num ^= top4_shifted;
    printf("异或后最终值:%u,二进制:0x%08X\n", num, num);

    return 0;
}

关于位编号的说明

如果你的"第1720位"是**从1开始计数**(最右侧为第1位),那么对应的实际bit位是bit16bit19,此时步骤3的左移位数需要改为16:

unsigned int top4_shifted = top4 << 16;

内容的提问来源于stack exchange,提问作者Play_Keys_Indeed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:35:29