【问题标题】:Read and extract specific number of bits of a 32-bit unsigned integer读取并提取 32 位无符号整数的特定位数
【发布时间】:2015-07-28 07:30:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您知道运算符& 并使用像0x000007FF 这样的掩码,不是吗?

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


【解决方案1】:

这是一个演示程序

#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。

【讨论】:

    【解决方案2】:

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

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

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

    当您为其分配一个双精度或浮点变量时,假设您要将整数值(例如 5)转换为浮点(例如 5.0),会隐式处理到浮点的转换。

    假设你的位被划分为

    xxxxxxxxxxxyyyyyyyyyyyzzzzzzzzzz
    

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

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

    【讨论】:

    • OP 的来源是 0xC0DFCF19 而不是 0 for v
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 2013-11-06
    • 1970-01-01
    • 2013-06-21
    • 2011-03-15
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多