c - 在c中将二进制int转换为二进制uint8_t
问题描述
我有一个数组定义为
int data[k];
其中 k 是数组的大小。数组的每个元素都是 0 或 1。我想将二进制数据保存在另一个定义为的数组中
uint8_t new_data[k/8];
(k 通常是 8 的倍数)。
我怎样才能在 C 中做到这一点?
提前致谢
解决方案
假设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内部循环会完全展开。
推荐阅读
- testing - 如何在 dart 中模拟 http 错误响应?
- c - gtk2 中已弃用的 gtk_list_new() 的替代方案?
- ruby-on-rails - 告诉 Rails 在公共/资产以外的地方寻找资产
- sql - 将两个 select 语句合二为一
- r - 向量化嵌套的 for 循环 r
- firebase - 在整个项目中上传到多个存储桶
- javascript - 仍然需要带有反应功能的帮助来显示减去其他两个变量的值
- inline - 如果在操作员期望的位置找到标量,则内联(我不精通 perl)
- javascript - d3.js v5.9.1 - 此版本中的某些方法无法按预期工作
- ios - UITableView 单元格自动布局约束