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

如何从最高有效位(MSB)开始交换两个比特位?

实现从MSB开始计数的比特位交换

你的原代码是按**LSB(最右侧为第0位)定位比特位的,要改成按MSB(最左侧为第0位)**计数,核心是把MSB的位置转换为对应的LSB位置,再复用原来的交换逻辑就行。

修改思路

  1. 先计算unsigned int的总比特数:不同平台的unsigned int位数可能不同,用sizeof(unsigned int) * 8可以通用获取总位数。
  2. 转换位置:MSB计数的位置p,对应的LSB计数位置是 总比特数 - 1 - p。比如4位的数,MSB第0位对应LSB第3位,MSB第2位对应LSB第1位。
  3. 用转换后的LSB位置执行你原来的比特交换逻辑。

修改后的完整代码

unsigned int swap_bits_msb(unsigned int num, int p1, int p2) {
    unsigned int BIT_COUNT = sizeof(unsigned int) * 8;
    // 将MSB计数的位置转换为LSB计数的位置
    unsigned int lsb_p1 = BIT_COUNT - 1 - p1;
    unsigned int lsb_p2 = BIT_COUNT - 1 - p2;

    // 复用你原来的交换逻辑,替换为转换后的位置
    unsigned int bit1 = (num >> lsb_p1) & 1;
    unsigned int bit2 = (num >> lsb_p2) & 1;
    unsigned int x = (bit1 ^ bit2);
    x = (x << lsb_p1) | (x << lsb_p2);
    return num ^ x;
}

验证你的例子

当num=8(二进制1000,按4位计算)、p1=0、p2=2时:

  • 总比特数BIT_COUNT=4,转换后lsb_p1=3,lsb_p2=1
  • 提取比特:bit1=(8>>3)&1=1,bit2=(8>>1)&1=0
  • 生成掩码:x=1^0=1,x=(1<<3)|(1<<1)=8+2=10(二进制1010)
  • 交换结果:8^10= 1000 ^ 1010 = 0010(即2),完全符合你的预期。

如果你的场景是固定位数(比如4位、8位),也可以直接把BIT_COUNT设为固定值,比如4,但用sizeof的方式更适配不同平台。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:10:29