2016-03-08 18 views
0

所以我最近碰到的東西來了這樣C++ - 如何使用位域

unsigned char ch : 7; 

一個結構裏面。我讀了一下。顯然這些被稱爲位域。它們用於設置char可以接收的數據的寬度。 但我們如何使用這些東西。例如,我知道,我們可以設置可變通道是一個字節

unsigned char ch = 0x61; 
cout << ch << endl; 

這將輸出

a 

但是,我們做什麼與位域?

unsigned char ch : 7; 
ch = 0x61;    //This doesn't work for some reason 

unsigned char ch : 7; 
unsigned char ch = 0x61/ //Neither does this. 

感謝您的幫助

+0

位域只能在'class','struct'和'union'類型中使用。 –

+1

http://en.cppreference.com/w/cpp/language/bit_field – user4581301

+0

我明白了。但是他們怎樣才能使用結構。他們能做什麼? –

回答

3

位字段只能結構化數據類型內使用,即structclass,和union類型。其目的是讓您在一個字節內打包多個成員,而無需編寫大量明確的輪班和口罩。例如,你可以寫:

struct halfbyte_t { 
    unsigned int half1: 4; 
    unsigned int half2: 4; 
} halfbyte; 

聲明一個名爲halfbyte變量,它包含兩個4位成員,將被打包成一個單一的8位字節,而不是必須,如果你只使用2個字節宣佈他們unsigned char

您訪問它們,就像任何其他結構成員:

halfbyte.half1 = 3; 
cout << halfbyte.half3; 

1位字段,如果你有大量的布爾標誌的結構,因爲你不必有一個單獨的字節尤其有用爲每個國旗。

struct flag_t { 
    unsigned int flag1: 1; 
    unsigned int flag2: 1; 
    unsigned int flag3: 1; 
    unsigned int flag4: 1; 
    ... 
}; 
+0

謝謝。這是一個很好的解釋。但我有一個後續問題。當你說這兩個半字節可以打包成一個8位字符時,我該怎麼做? –

+0

@Q_A最便攜和語義上正確的是算術,例如。 '(half1 << 4)| half2'或其他方式。你可以用工會破解它或重新解釋演員陣容,但結果並不總是一致的。另見http://stackoverflow.com/questions/19376426/order-of-fields-when-using-a-bit-field-in-c。主要用途是在內存受限的環境中節省空間。如果你發現你經常需要結合它們的值,那麼你可能會重新考慮使用位域;他們真的是在語義上分離的東西。 –

+0

@Q_A你不這樣做,它由編譯器自動完成。這就是整個問題。 – Barmar