获取数字最左边两个位的值的最便宜的方法是什么?
What's the cheapest way to get the value of the two leftmost bits of a number?
我想返回 0,1,2 或 3,基于最左边的 2 位是 00 01 10 或 11。
当我想要最右边的两个位时,我只是用%4
.我看到我可以将我的 int 右移到正确的位置(如果是 30 位,则为 32(,然后使用 %4,但这是 2 个操作。有没有"一个操作码"的方法?
如果您使用的是 32 位整数,则右移 30 就足够了。
uint32_t get_value(uint32_t val) {
return val >> 30;
}
如果您使用的是 64 位整数,则需要按以下方式更改移位的值:
uint64_t get_value(uint64_t val) {
return val >> 62;
}
采用通用解决方案并没有什么坏处:
template <typename UnsignedInteger>
inline UnsignedInteger
top_two_bits(UnsignedInteger value)
{
return value >> ((sizeof(UnsignedInteger) << 3) - 2);
}
如果您决定进一步使用不同的无符号整数类型,只会让事情变得更容易。在任何情况下,编译器都应该能够以与宏或其他方式一样高效的方式来内联整个表达式。
编辑
此外,(这可能有点矫枉过正,但只是为了完善示例(您可以使用简单的模板元编程技术来创建与任何类型的整数无缝协作的东西,而不会影响效率:
template <typename SignedInteger, bool IsSignedInteger>
struct duduce_sign_dispatch_
{
static inline SignedInteger
top_two_bits(SignedInteger value)
{
return (value >> ((sizeof(SignedInteger) << 3) - 2)) & SignedInteger(3);
}
};
template <typename UnsignedInteger>
struct duduce_sign_dispatch_<UnsignedInteger, false>
{
static inline UnsignedInteger
top_two_bits(UnsignedInteger value)
{
return value >> ((sizeof(UnsignedInteger) << 3) - 2);
}
};
template <typename Integer>
inline Integer
top_two_bits(Integer value)
{
return duduce_sign_dispatch_<Integer, (~Integer() < 0)>::top_two_bits(value);
}
相关文章:
- 复制几乎为空的数组的最快方法
- 通过JNI传递数据数组的最快方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在C++中初始化向量映射的最有效方法
- 在C++中迭代 2D 容器的最干净方法
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 从容器创建一系列索引的最惯用方法是什么?
- 将时间戳打印到流的最简单方法
- 比较C++变量的最有效方法
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 获取数字最左边两个位的值的最便宜的方法是什么?
- boost::multiprecision:乘以或除以 10 的巨大幂最便宜的方法是什么?类似于 10 次方的位移运算?
- 在 c++ 中,知道路径是否引用文件夹或文件的最便宜的方法是什么?
- 特化trait成员最便宜的方法是什么?