2013-07-28 64 views
1

我想用它返回應該包含8個比特的信息,在小尾數格式的uint32_t功能位。可能有人給我如何提取從uint32_t型這些位爲字符,布爾值或到任何其他類型不需要使用部隊來處理一些C++代碼!因爲現在我沒有耐心來理解整體概念。而更多的我搜索您的理解更爲複雜,似乎...謝謝!讀取uint32_t的

PS。雖然我覺得不是我所期待的,如果有人也可以張貼在一個如何能夠編碼8位一些代碼(例如8個布爾)在uint32_t將是有趣的,這將有助於我理解這個概念。謝謝!

回答

0

字節順序不應該在這裏的一個問題。你試過了嗎?

+0

嗯,我已經嘗試「推」uint32_t到一個字符串流並從中獲取一個字符串,但我得到的字符串只包含一個零。所以我想它不能正確提取這些位。 – venkman

+0

你典型的stringstream不應該提取位。只是爲了記錄:我們在說什麼語言?有關位函數的引言,另請參見[位操縱](http://en.wikipedia.org/wiki/Bit_manipulation)。 – usr2564301

0

小尾數是指組成uint32_t的字節具有存儲在最低的內存地址中的至少顯著字節,在最高最顯著。當提取位時,Endian-ness不應該輸入圖片。如果您正在通過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; 
} 
0

當訪問一個變量,它會自動由系統(在86的情況下,小端)的默認字節順序加載的,所以如果你想低8位,只敷個面膜和獲取值

x = someint32 & 0xff; 

同樣地,分配charint,或使用它在表達將擴展(有符號或零依賴於炭的signess),字節序不應該在這裏是一個問題。如果您想直接訪問內存,則只應該注意字節順序。

2

在C A樣品,使用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; 
} 

這允許容易讀/寫訪問到整數值和每個獨立的位,任何更方便。