Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';求一个数字最左边两位的值最便宜的方法是什么?_C++_Bit Manipulation - Fatal编程技术网

C++ 什么';求一个数字最左边两位的值最便宜的方法是什么?

C++ 什么';求一个数字最左边两位的值最便宜的方法是什么?,c++,bit-manipulation,C++,Bit Manipulation,我想返回0,1,2或3,基于最左边的2位是00 01 10还是11 当我需要最右边的两个位时,我只使用了%4。 我发现我可以将int右移到正确的位置(如果是32位,则为ex30),然后使用%4,但这是2个操作。有“一个操作码”的方法吗?如果您使用的是32位整数,右移30位就足够了 uint32_t get_value(uint32_t val) { return val >> 30; } 如果使用的是64位整数,则需要更改移位的值: uint64_t get_value(u

我想返回0,1,2或3,基于最左边的2位是00 01 10还是11

当我需要最右边的两个位时,我只使用了
%4

我发现我可以将int右移到正确的位置(如果是32位,则为ex30),然后使用%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;
}

如果使用的是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);
}
模板
内联无符号整数
顶部两位(无符号整数值)
{

返回值>>((sizeof(UnsignedInteger)选择通用解决方案不会有什么坏处:

template <typename UnsignedInteger>
inline UnsignedInteger 
    top_two_bits(UnsignedInteger value)
{
    return value >> ((sizeof(UnsignedInteger) << 3) - 2);
}
模板
内联无符号整数
顶部两位(无符号整数值)
{


返回值>>((sizeof(UnsignedInteger)谁说
%4
始终是一个操作码?@NeilButterworth。但是换了一个。@OP,你是只做一次还是循环做一次?你没有提到这个数字是否有符号。如果它没有符号,那么右移位就足够了,屏蔽是多余的。编译器可能很聪明,可以将
%4
优化为掩码是的,但如果不是,除法和模运算比掩蔽或其他位运算慢得多。谁说
%4
总是一个操作码?@NeilButterworth。但是移位了。@OP,你是只做一次还是循环一次?你没有提到数字是否有符号。如果是无符号的,那么右移位就足够了屏蔽是多余的。编译器可能会聪明地将
%4
优化为屏蔽,但如果不是,则除法和模运算要比屏蔽或其他位操作慢得多。我要强调的是,无符号整数是正确工作所必需的。如果它不是无符号的,则需要屏蔽,因为最糟糕的情况可能是ppen表示将填充较高的位。它仍然可以正常工作。此外,输入和输出类型非常清楚地表明数字是无符号的。@Madpheticator如果不是无符号的,则结果是实现定义的;它可能只是两个补码的算术移位。对于任何类型的移位操作,或任何其他按位操作f或者说,你可能想先强制转换为无符号。@DanielH。目前很少有非twos补码体系结构。我曾经查看过这一点,OP不太可能在其中一个体系结构上。但是,是的,先强制转换为无符号是个好主意。我要强调的是,无符号整数是这个体系结构工作所必需的正确如果不是无符号的,则需要掩码,因为最糟糕的情况是会填充较高的位。它仍然可以正常工作。此外,输入和输出类型非常清楚地表明数字是无符号的。@MadPhysical如果不是无符号的,则结果是实现定义的;它可能只是两个补码算术集ic移位。对于任何类型的移位操作,或者任何其他按位操作,您可能希望首先强制转换为无符号。@DanielH。目前很少有非twos补码体系结构。我曾查看过这一点,OP极不可能在其中一个上。但是,是的,强制转换为无符号的第一个I这是个好主意。