c – 最快的方式来生成一个从i位置开始的n个面具

c – 最快的方式来生成一个从i位置开始的n个面具,第1张

概述什么是最快的方式(在通用现代架构的cpu周期方面),产生一个从位置pos开始的len位设置为1的掩码: template <class UIntType>constexpr T make_mask(std::size_t pos, std::size_t len){ // Body of the function}// Call of the functionauto mask 什么是最快的方式(在通用现代架构的cpu周期方面),产生一个从位置pos开始的len位设置为1的掩码:
template <class UIntType>constexpr T make_mask(std::size_t pos,std::size_t len){    // Body of the function}// Call of the functionauto mask = make_mask<uint32_t>(4,10);// mask = 00000000 00000000 00111111 11110000 // (in binary with MSB on the left and LSB on the right)

另外,是否有任何编译器内在或BMI功能可以帮助?

解决方法 如果通过“从pos开始”,您的意思是掩码的最低位位于与2pos对应的位置(如您所示):
((UIntType(1) << len) - UIntType(1)) << pos

如果len可能≥UIntType中的位数,请通过测试避免未​​定义行为:

(((len < std::numeric_limits<UIntType>::digits)     ? UIntType(1)<<len     : 0) - UIntType(1)) << pos

(如果pos也可能是≥std :: numeric_limits< UIntType> :: digits,则需要进行另一个三进制 *** 作测试.)

你也可以使用:

(UIntType(1)<<(len>>1)<<((len+1)>>1) - UIntType(1)) << pos

这避免了三个额外的班次运算符的三元 *** 作;我怀疑是否会更快,但仔细的基准测试是必要的,以确定.

总结

以上是内存溢出为你收集整理的c – 最快的方式来生成一个从i位置开始的n个面具全部内容,希望文章能够帮你解决c – 最快的方式来生成一个从i位置开始的n个面具所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1255053.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存