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

如何将两个4位半字节(nibble)组合成一个8位字节(byte)?

4位整数打包到char的实现方案

核心思路是利用位左移和按位或操作,将两个4位(0-15)整数分别放到char的高4位和低4位;解包则用右移和按位与操作提取对应位段。

打包实现

先确保输入的整数是4位范围(超出则截断),再将高4位的数左移4位,与低4位的数按位或,得到最终的char值:

// 打包两个4位整数到一个char:high_nibble占高4位,low_nibble占低4位
char pack_nibbles(unsigned char high_nibble, unsigned char low_nibble) {
    // 截断输入到4位范围(确保0-15)
    high_nibble &= 0x0F;
    low_nibble &= 0x0F;
    // 左移高4位,再与低4位合并
    return (high_nibble << 4) | low_nibble;
}

以你给出的例子测试:high_nibble=5(二进制0101),low_nibble=0xC(十进制12,二进制1100),打包后得到01011100(十进制92,十六进制0x5C),符合预期。

解包实现

如果需要从打包后的char中还原两个4位整数,用以下方法:

// 提取高4位的整数
unsigned char get_high_nibble(char packed) {
    // 转成unsigned避免符号扩展,再右移4位
    return (unsigned char)packed >> 4;
}

// 提取低4位的整数
unsigned char get_low_nibble(char packed) {
    // 用0x0F掩码保留低4位
    return (unsigned char)packed & 0x0F;
}

批量处理16个4位整数

直接循环每两个一组打包,存入char数组即可:

#include <stdio.h>

// 上面的pack_nibbles、get_high_nibble、get_low_nibble函数放这里

int main() {
    // 示例:16个4位整数(0-15)
    unsigned char nibbles[16] = {0,1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF};
    char packed_arr[8]; // 16个4位整数 → 8个char

    // 批量打包
    for (int i = 0; i < 16; i += 2) {
        packed_arr[i/2] = pack_nibbles(nibbles[i], nibbles[i+1]);
    }

    // 验证解包
    for (int i = 0; i < 8; i++) {
        unsigned char h = get_high_nibble(packed_arr[i]);
        unsigned char l = get_low_nibble(packed_arr[i]);
        printf("第%d个char:高4位=%d(0x%X),低4位=%d(0x%X)\n", 
               i+1, h, h, l, l);
    }
    return 0;
}

注意事项

  • 输入截断:必须用& 0x0F确保输入是4位范围,否则超出的位会污染打包后的结果。
  • 符号位问题:若编译器中char是有符号类型,当打包后的最高位为1时,char会被视为负数,但转成unsigned char处理即可避免符号扩展影响位操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:21