在C中将Binary Int转换为Binary uint8_t

时间:2018-10-13 13:07:15

标签: c binary int hex uint8t

我有一个定义为

的数组
int data[k];

其中k是数组的大小。数组的每个元素都是0或1。我想将二进制数据保存在另一个定义为

的数组中
uint8_t new_data[k/8];

(k通常是8的倍数)。
我该如何在C语言中做到这一点?

预先感谢

2 个答案:

答案 0 :(得分:0)

假设new_data开始初始化为0,data[i]仅包含零和一,并且您要首先填充最低位:

for(unsigned i = 0; i < k; ++i) {
    new_data[i/8] |= data[i]<<(i%8);
}

可能更快的实现 1 可能是:

for(int i = 0; i < k/8; ++i) {
    uint8_t o = 0;
    for(int j = 0; j < 8; ++j) {
        o |= data[i*8]<<j;
    }
    new_data[i] = o;
}

(请注意,这实际上是假设k是8的倍数)


  1. 通常更容易优化,因为内部循环具有较小的已知边界,并且只在较小范围内写变量;这对于优化人员来说更容易处理,例如,您可以使用gcc the inner loop gets completely unrolled看到它。

答案 1 :(得分:0)

假设k8的倍数,假设“每个元素都是二进制的”是指“每个int01 “,还假设data中的位从最高有效位到最低有效位被打包,并且new_data的字节被打包为big-endian(所有合理的假设),那么您将按照以下方式进行操作:< / p>

for (int i = 0; i < k/8; ++i)
{
    new_data[i] = (data[8*i  ] << 7) | (data[8*i+1] << 6)
                | (data[8*i+2] << 5) | (data[8*i+3] << 4)
                | (data[8*i+4] << 3) | (data[8*i+5] << 2)
                | (data[8*i+6] << 1) | data[8*i+7];
}