繁体   English   中英

从 uint32_t 读取位

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM