[英]Read bits from uint32_t
我想使用一个返回uint32_t
的函数,该函数应该包含 8 位信息,采用 little-endian 格式。 有人可以给我一些关于如何将这些位从uint32_t
类型提取为字符、布尔值或任何其他不需要使用 Force 来处理的类型的 C++ 代码! 因为现在我没有耐心去理解字节序的整个概念。 而且我越是肤浅地搜索,它似乎就越复杂......
附注。 虽然不是我想要的,但如果有人也可以发布一些关于如何在uint32_t
编码 8 位(例如 8 个布尔值)的代码会很有趣,因为我认为这会帮助我理解这个概念。
C 中的一个示例,使用union
强制在同一地址空间中同时使用整数和组合位值,并使用位域b0..b7
来保存单个位值:
#include <stdio.h>
union Bitfields {
unsigned int as_int;
struct {
unsigned char b0:1,b1:1,b2:1,b3:1,
b4:1,b5:1,b6:1,b7:1;
} as_bit;
};
int main (void)
{
Bitfields bitfield;
bitfield.as_int = 73;
printf ("%u %u %u\n", bitfield.as_int, bitfield.as_bit.b0, bitfield.as_bit.b1);
return 0;
}
这允许轻松读/写访问整数值和每个单独的位,无论更方便。
字节顺序在这里不应该成为问题。 你试过了吗?
小端意味着组成 uint32_t 的字节的最低有效字节存储在最低内存地址,最高有效字节存储在最高地址。 提取位时,字节序不应进入图片。 如果您正在执行诸如通过 char * 访问 uint32_t 变量之类的操作,它只会进入图片。
#include <iostream>
#include <cstdint>
using namespace std;
int main()
{
unsigned char ch;
uint32_t u32;
bool b0, b1, b2, b3, b4, b5, b6, b7;
// If the 8 bits you need are the least significant ones then getting
// them is as easy as:
u32 = 73;
ch = u32 & 0xFF;
cout << ch << endl;
// To encode boolean variables is just as easy:
b0 = b1 = b3 = b5 = 0;
b2 = b4 = b6 = b7 = 1;
u32 = (b0 << 0) | (b1 << 1) | (b2 << 2) | (b3 << 3) | (b4 << 4) |
(b5 << 5) | (b6 << 6) | (b7 << 7);
cout << hex << u32 << endl;
return 0;
}
字节序处理内存加载/存储而不是值
访问变量时,它将使用系统的默认字节序(x86 中的小字节序)从内存中加载,并为您提供变量中的正确值。 因此,如果您想要 8 个低位,只需应用一个掩码并获得该值
x = someint32 & 0xff;
同样,将char
分配给int
或在表达式中使用它只会复制其values 。 位模式将根据类型的符号进行符号扩展或零扩展,但您仍然只处理值。 字节序在这里无关紧要,因为没有内存访问
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.