其他分享
首页 > 其他分享> > c-如何将32个字符(0/1)的序列转换为32位(uint32_t)?

c-如何将32个字符(0/1)的序列转换为32位(uint32_t)?

作者:互联网

我有一个从文件读取的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];

如果这种怪异的移位是运行时最快的,那么我就必须坚持下去.

解决方法:

限于x86平台,可以使用PEXT指令.它是新处理器上BMI2指令集扩展的一部分.

连续使用32位指令,然后通过移位将结果合并为一个值.

这可能是在Intel处理器上的最佳方法,但是缺点是该指令在AMD Ryzen上速度较慢.

标签:data-conversion,c,bit-manipulation,bit-shift
来源: https://codeday.me/bug/20191013/1904618.html