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 这避免了三个额外的班次运算符的三元操作;我怀疑是否会更快,但仔细的基准测试是必要的,以确定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 需要多少磁盘空间才能使用postgresql DB存储NULL
- SQLite 3 一些基本使用
- ruby – Jekyll忽略帖子中的Liquid标签
- ruby – 将ORM添加到现有的padrino应用程序
- how to check whether image object has value
- 在创建sqlite3表后,将ON DELETE CASCADE行为添加
- oracle – 使用TYPE属性检索VARRAY元素类型
- ruby-on-rails – 在我的Heroku应用程序中导致这
- 简单暴力!21 分钟学会 apollo-client + redux
- cocos2dx-3.0 : EventDispatcher
热点阅读