将字节转换为位数组? C

时间:2017-01-17 22:41:29

标签: c bit-manipulation

我想在此时读取二进制文件字节,然后将该字节的位存储到整数数组中。同样地,我想将1和0的整数数组(其中8个)写成二进制文件作为字节?

1 个答案:

答案 0 :(得分:4)

如果你有一个字节数组:

unsigned char bytes[10];

并希望将其更改为位数组:

unsigned char bits[80];

假设每个字节有8位,请尝试:

int i;
for (i=0; i<sizeof(bytes)*8; i++) {
    bits[i] = ((1 << (i % 8)) & (bytes[i/8])) >> (i % 8);
}

在此循环中,i循环总位数。给定位所在的字节为i/8,整数除法向下舍入。该位在一个字节内的位置是i%8

首先,我们为所需的位创建一个掩码:

1 << (i % 8)

然后是所需的字节:

bytes[i/8]

然后我们执行逻辑AND以清除除我们想要的所有位之外的所有位。

(1 << (i % 8)) & (bytes[i/8])

然后我们将结果右移位位,将所需位置于最低有效位。这给了我们1或0的值。

另请注意,有问题的数组是unsigned。这是位移正常工作所必需的。

切换回来:

int i;
memset(bytes, 0, sizeof(bytes));
for (i=0; i<sizeof(bytes)*8; i++) {
    bytes[i/8] |= bits[i] << (i % 8);
}

我们首先清除字节数组,因为我们将每个字节一次设置一位。

然后我们讨论这个问题:

bits[i]

将其移至其位置:

bits[i] << (i % 8)

然后使用逻辑OR设置适当的字节;