我想使用一个函数来返回一个uint32_t
,它应该包含8位信息,采用小端格式。有人可以给我一些关于如何从uint32_t
类型中提取这些位到crs,booleans或任何其他不需要使用Force来处理的类型的c ++代码!因为现在我没有耐心去了解endianess的整个概念。而且我越浅搜索越复杂似乎......感谢您的理解!
PS。虽然不是我想要的,如果有人也可以发布一些关于如何在uint32_t
中编码8位(例如8个布尔值)的代码会很有趣,因为我认为它会帮助我理解这个概念。谢谢!
答案 0 :(得分:2)
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;
}
这允许对整数值和每个单独位进行简单的读/写访问,无论更方便。
答案 1 :(得分:0)
Endianness不应成为问题。你试过吗?
答案 2 :(得分: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;
}
答案 3 :(得分:0)
Endianness处理内存加载/存储而非值
访问变量时,它将使用系统的默认字节序(在x86的情况下为小端)从内存加载,并在变量中为您提供正确的值。因此,如果您想要8个低位,只需应用一个掩码并获得该值
x = someint32 & 0xff;
同样,将char
分配到int
或在表达式中使用它只会复制其值。位模式将根据类型的符号进行符号扩展或零扩展,但您仍然只处理值。 Endianness与此无关,因为没有内存访问