我想使用一个返回 a 的函数,uint32_t
它应该包含 8 位信息,采用 little-endian 格式。有人可以给我一些关于如何将这些位从uint32_t
类型中提取为字符、布尔值或任何其他不需要使用原力处理的类型的 C++ 代码!因为现在我没有耐心去理解字节序的整个概念。而且我越是浅浅地搜索它似乎就越复杂......
PS。虽然不是我想要的,但如果有人也可以发布一些关于如何编码 8 位(例如 8 个布尔值)的代码uint32_t
会很有趣,因为我认为这将有助于我理解这个概念。
我想使用一个返回 a 的函数,uint32_t
它应该包含 8 位信息,采用 little-endian 格式。有人可以给我一些关于如何将这些位从uint32_t
类型中提取为字符、布尔值或任何其他不需要使用原力处理的类型的 C++ 代码!因为现在我没有耐心去理解字节序的整个概念。而且我越是浅浅地搜索它似乎就越复杂......
PS。虽然不是我想要的,但如果有人也可以发布一些关于如何编码 8 位(例如 8 个布尔值)的代码uint32_t
会很有趣,因为我认为这将有助于我理解这个概念。
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;
}
这允许对整数值和每个单独的位进行轻松的读/写访问,无论哪个更方便。
Little endian 意味着构成 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;
同样,将 a 赋值给char
anint
或在表达式中使用它只会复制它的values。位模式将根据类型的符号进行符号扩展或零扩展,但您仍然只处理值。字节序在这里无关紧要,因为没有内存访问