读取并提取32位无符号整数的特定位数
Read and extract specific number of bits of a 32-bit unsigned integer
如何在c++/C中读取和提取32位无符号整数的特定位数?然后,结果值转换为浮点数。
例如:32整数0xC0DFCF19 for x=读取11位,y=读取11位,for z =读取32位整数的最后10位。提前感谢!
好吧!非常感谢所有的答案,非常有帮助!
有人可以给出一个示例代码如何以类似的方式读取这个整数0x7835937C,但"y"应该是334 (x,z保持不变)谢谢
下面是一个示范程序
#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声明为浮点数
一般的想法是使用按位布尔运算和移位运算符>>
来屏蔽部分位,将这些位移动到所需的位置。特别是&
操作符允许您保留特定的位,并将其他所有位设置为零。在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;
相关文章:
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 计算机使用什么方法添加无符号整数
- boost::任何带有结构体和无符号整数
- 添加有符号和无符号整数
- 如何安全地比较两个无符号整数计数器?
- 计算 (64 位无符号整数) * (64 位无符号整数) 的商除以 2^64
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何将以"\0"开头的字符 * 转换为无符号整数?
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 为大无符号整数分配内存的有效方法
- 获取两个无符号整数 C++ 乘积的高 32 位的有效方法