从uint32_t读取位

时间:2013-07-28 01:18:56

标签: bits uint32-t

我想使用一个函数来返回一个uint32_t,它应该包含8位信息,采用小端格式。有人可以给我一些关于如何从uint32_t类型中提取这些位到crs,booleans或任何其他不需要使用Force来处理的类型的c ++代码!因为现在我没有耐心去了解endianess的整个概念。而且我越浅搜索越复杂似乎......感谢您的理解!

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

4 个答案:

答案 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与此无关,因为没有内存访问