1

我想使用一个返回 a 的函数,uint32_t它应该包含 8 位信息,采用 little-endian 格式。有人可以给我一些关于如何将这些位从uint32_t类型中提取为字符、布尔值或任何其他不需要使用原力处理的类型的 C++ 代码!因为现在我没有耐心去理解字节序的整个概念。而且我越是浅浅地搜索它似乎就越复杂......

PS。虽然不是我想要的,但如果有人也可以发布一些关于如何编码 8 位(例如 8 个布尔值)的代码uint32_t会很有趣,因为我认为这将有助于我理解这个概念。

4

3 回答 3

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;
}

这允许对整数值和每个单独的位进行轻松的读/写访问,无论哪个更方便。

于 2013-07-28T02:48:50.427 回答
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;
}
于 2013-07-28T02:02:21.710 回答
0

字节序处理内存加载/存储而不是

访问变量时,它将使用系统的默认字节序(x86 的情况下为小字节序)从内存中加载,并为您提供变量中的正确。因此,如果您想要 8 个低位,只需应用掩码并获取该值

x = someint32 & 0xff;

同样,将 a 赋值给charanint或在表达式中使用它只会复制它的values。位模式将根据类型的符号进行符号扩展或零扩展,但您仍然只处理值。字节序在这里无关紧要,因为没有内存访问

于 2013-07-28T02:18:50.123 回答