如何交换32位整数的第一个与最后一个半字节
32位整数首尾半字节交换问题修复
问题说明
给定整数77(32位二进制:0000 0000 0000 0000 0000 0000 0100 1101),需要交换最高4位(第一个半字节)与最低4位(最后一个半字节),预期结果为:1101 0000 0000 0000 0000 0000 0100 0000。
原代码问题分析
你编写的交换逻辑decimalNumber = (decimalNumber>>28) | (decimalNumber<<28)存在两个核心问题:
- 左移28位时,会将原数的低28位整体左移,导致原数的低8位(如77的
01001101)全部移到高8位,而非仅提取低4位移动到高4位。 - 未保留原数中间24位(位4到位27)的数值,直接移位或操作会覆盖这些位。
修正后的代码
#include<stdio.h> int main() { int decimalNumber; printf("Enter your decimal number: "); scanf("%d", &decimalNumber); int i; // 打印原数的32位二进制(每4位加空格方便阅读) printf("Original binary: "); for(i=31;i>=0;i--) { printf("%d", (decimalNumber >> i) & 1); if(i % 4 == 0) printf(" "); } printf("\n"); // 首尾半字节交换核心逻辑 int original = decimalNumber; int low_to_high = (original & 0x0F) << 28; // 提取低4位并移到最高4位 int high_to_low = (original >> 28) & 0x0F; // 提取最高4位并移到最低4位 int middle = original & 0x0FFFFFF0; // 保留中间24位(位4到位27) decimalNumber = low_to_high | middle | high_to_low; // 打印交换后的32位二进制 printf("After nibble swapping: "); for(i=31;i>=0;i--) { printf("%d", (decimalNumber >> i) & 1); if(i % 4 == 0) printf(" "); } printf("\n"); return 0; }
代码解释
0x0F是低4位掩码,用于精准提取原数的最低4位,左移28位后将其放到最高位位置。original >> 28把原数的最高4位移到最低位区域,再用& 0x0F过滤掉多余高位,仅保留这4位。0x0FFFFFF0是中间24位掩码,保留原数的位4到位27,同时清零首尾4位,避免干扰交换结果。- 最后通过按位或操作将三部分合并,得到首尾半字节交换后的完整数值。
测试结果
输入77时,交换后的二进制输出为:1101 0000 0000 0000 0000 0000 0100 0000,与预期完全一致。
内容的提问来源于stack exchange,提问作者Manvi Koul
相关产品推荐
相关产品推荐

