读取并提取32位无符号整数的特定位数

时间:2015-05-16 11:54:57

标签: c# c++ bit bitwise-operators 32-bit

如何在C ++ / C中读取和提取32位无符号整数的特定位数?然后,结果值转换为浮点。

例如: 32整数0xC0DFCF19用于x =读取11位,y =读取11位,z =读取最后10位32位整数。 提前谢谢!

好!非常感谢所有答案,非常有帮助!

有人可以给出一个示例代码如何以类似的方式读取这个整数0x7835937C,但“y”应该是334(x,z保持不变)谢谢

2 个答案:

答案 0 :(得分:0)

一般的想法是使用按位布尔运算和移位运算符>>来屏蔽部分位,以将位移动到所需位置。 具体来说,&运算符允许您按原样使特定位,并将所有其他位设置为零。 与y的示例一样,您需要从输入的32位屏蔽位11-21,如:

input  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
& with 00000000000111111111110000000000
=      00000000000xxxxxxxxxxx0000000000
shift by 10 bits to the right
=      000000000000000000000xxxxxxxxxxx

由于无法以C风格写入位,因此必须将位掩码转换为十六进制。

如果要为整数值(例如5)转换为浮点(例如5.0),则为其指定double或float变量时,将明确处理到浮点的转换。

假设您的位被分区为

xxxxxxxxxxxyyyyyyyyyyyzzzzzzzzzz

并且您想要双重结果,那么您的示例将如下:

int v = 0; //input
double x = v >> 21;
double y = (v & 0x1FFC00) >> 10;
double z = v & 0x3FF;

答案 1 :(得分:0)

这是一个示范程序

#include <iostream>
#include <iomanip>
#include <cstdint>

int main() 
{
    std::uint32_t value = 0xC0DFCF19;
    std::uint32_t x = value & 0x7FF;
    std::uint32_t y = ( value & ( 0x7FF << 11 ) ) >> 11;
    std::uint32_t z = ( value & ( 0x3FF << 22 ) ) >> 22;

    std::cout << "value = " << std::hex << value << std::endl;
    std::cout << "x = " << std::hex << x << std::endl;
    std::cout << "y = " << std::hex << y << std::endl;
    std::cout << "z = " << std::hex << z << std::endl;

    return 0;
}

程序输出

value = c0dfcf19
x = 719
y = 3f9
z = 303

如果需要,您可以像浮点数一样声明变量x,y,z。