标签:data-conversion c bit-manipulation bit-shift
我有一个从文件读取的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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。