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

如何交换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:15:34