>我有一个数组定义为
int data[k];
其中 k 是数组的大小。数组的每个元素都是 0 或 1。我想将二进制数据保存在另一个定义为
uint8_t new_data[k/8];
(k 通常是 8 的倍数(。
如何在 C 中执行此操作?
提前致谢
假设k
是8
的倍数,假设"每个元素都是二进制的",你的意思是"每个int
要么0
要么1
",也假设data
中的位从最重要到最不重要,并且new_data
的字节被打包为大端序(所有合理的假设(, 那么这就是你的做法:
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];
}
假设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 的倍数(
- 因为内部循环具有小的已知边界,并且它写入一个范围很小的变量;这对于优化器来说更容易处理,例如,您可以看到使用 gcc,内部循环完全展开。