加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:21:47 所属栏目:百科 来源:网络整理
导读:什么是最快的方式(在通用现代架构的cpu周期方面),产生一个从位置pos开始的len位设置为1的掩码: template class UIntTypeconstexpr T make_mask(std::size_t pos,std::size_t len){ // Body of the function}// Call of the functionauto mask = make_maskui
什么是最快的方式(在通用现代架构的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 function
auto mask = make_mask<uint32_t>(4,10);
// mask = 00000000 00000000 00222221 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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读