簡體   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