【发布时间】:2018-12-03 02:27:09
【问题描述】:
我有一个从文件中读取的 char 数组(通常是数千字节长),全部由 0 和 1 组成(不是 '0' 和 '1',在这种情况下我可以使用 strtoul)。我想将它们打包成单个位,从而将每个 32 个字符转换为单个 uint32_t。我应该写一个 32 部分的位移操作,还是有更理智的方法?
out[i/32] =
data[i] << 31 |
data[i+1] << 30 |
data[i+2] << 29 |
data[i+3] << 28 |
data[i+4] << 27 |
data[i+5] << 26 |
data[i+6] << 25 |
data[i+7] << 24 |
data[i+8] << 23 |
data[i+9] << 22 |
data[i+10] << 21 |
data[i+11] << 20 |
data[i+12] << 19 |
data[i+13] << 18 |
data[i+14] << 17 |
data[i+15] << 16 |
data[i+16] << 15 |
data[i+17] << 14 |
data[i+18] << 13 |
data[i+19] << 12 |
data[i+20] << 11 |
data[i+21] << 10 |
data[i+22] << 9 |
data[i+23] << 8 |
data[i+24] << 7 |
data[i+25] << 6 |
data[i+26] << 5 |
data[i+27] << 4 |
data[i+28] << 3 |
data[i+29] << 2 |
data[i+30] << 1 |
data[i+31];
如果这个可怕的位移是运行时最快的,那么我将不得不坚持下去。
【问题讨论】:
-
是的,按位
or并在迭代每个字节时移位是我认为在这种情况下你能做的所有事情。 -
整个文件只有32字节长?或者您真的想对长字节流执行此操作?
-
@BeeOnRope 这取决于光栅的大小。我在 40,000 字符长(相当于栅格中的一行)上对其进行测试。
标签: c++ bit-manipulation bit-shift data-conversion