Jac*_*ack -1 c bit-manipulation
我想当时读取二进制文件字节,然后将该字节的位存储到整数数组中。同样,我想将 1 和 0(其中 8 个)的整数数组作为字节写入二进制文件?
如果您有一个字节数组:
unsigned char bytes[10];
Run Code Online (Sandbox Code Playgroud)
并想将其更改为位数组:
unsigned char bits[80];
Run Code Online (Sandbox Code Playgroud)
假设你有每字节 8 位,试试这个:
int i;
for (i=0; i<sizeof(bytes)*8; i++) {
bits[i] = ((1 << (i % 8)) & (bytes[i/8])) >> (i % 8);
}
Run Code Online (Sandbox Code Playgroud)
在此循环中,i循环遍历总位数。给定位所在的字节是i/8,作为整数除法向下舍入。该位在一个字节中的位置是i%8。
首先,我们为所需的位创建一个掩码:
1 << (i % 8)
Run Code Online (Sandbox Code Playgroud)
然后是所需的字节:
bytes[i/8]
Run Code Online (Sandbox Code Playgroud)
然后我们执行一个逻辑与来清除所有位,除了我们想要的位。
(1 << (i % 8)) & (bytes[i/8])
Run Code Online (Sandbox Code Playgroud)
然后我们将结果右移位位置以将所需位放在最低有效位。这给了我们 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);
}
Run Code Online (Sandbox Code Playgroud)
我们首先清除字节数组,因为我们将一次设置每个字节一位。
然后我们把有问题的一点:
bits[i]
Run Code Online (Sandbox Code Playgroud)
将其移动到其位置:
bits[i] << (i % 8)
Run Code Online (Sandbox Code Playgroud)
然后使用逻辑或来设置合适的字节;