如何从最高有效位(MSB)开始交换两个比特位?
实现从MSB开始计数的比特位交换
你的原代码是按**LSB(最右侧为第0位)定位比特位的,要改成按MSB(最左侧为第0位)**计数,核心是把MSB的位置转换为对应的LSB位置,再复用原来的交换逻辑就行。
修改思路
- 先计算
unsigned int的总比特数:不同平台的unsigned int位数可能不同,用sizeof(unsigned int) * 8可以通用获取总位数。 - 转换位置:MSB计数的位置
p,对应的LSB计数位置是总比特数 - 1 - p。比如4位的数,MSB第0位对应LSB第3位,MSB第2位对应LSB第1位。 - 用转换后的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
相关产品推荐
相关产品推荐

