2012-10-03 50 views
1

我目前正在研究一個需要我存儲32位模式並分析它的項目。我需要一種方法將例如「1001 1001 1100 1000」這樣的模式存儲在變量中,例如,它不會被重新解釋爲char。在C++中存儲字節模式

+0

'uint32_t x = 0x99c8;' – avakar

+1

@avakar - 'uint_least32_t'更便攜。 'unsigned long'更是如此。 –

回答

2

在C++ 03中,我會使用unsigned intunsigned long,但都沒有被指定爲完全32位。 unsigned long被指定爲能夠保持至少的值[0,2 -1],所以理論上它可以是大於32個比特。在C++ 11中,我會使用uint32_t;

例如0000 0000 0000 0000 1001 1001 1100 10000x99c8,其中0x是十六進制前綴。

uint32_t bitpattern = 0x998c 

如果變量bitpattern包含所需的位模式,你想流呢安慰爲十六進制數,你會使用這樣的:

std::cout << std::hex << bitpattern; 
+0

你應該提到'uint32_t'被標準標記爲可選。爲了完全安全,請使用'uint_least32_t'。 –

0

你一定要明白的是,模式不是32位,對吧?

既然不是,像

unsigned long pattern = 0x99c8; 

應該是非常安全的,你會很難找到一個平臺,讓unsigned long小於16位。萊克阿爾門說,如果你有uint32_t,使用它。

+4

「長」總是至少32位寬。 – avakar

1

如果你想在32種模式轉換爲int,你也可以使用STL容器<bitset>做的工作:

std::bitset<32> bit(std::string("0001100111001000")); 
long unsigned bit_number = bit.to_ulong(); 
std::string bit_string = bit.to_string(); 
0

除了試圖使用一體型和bitmasking創建自己的系統,您可能還需要考慮內置的很少使用的功能,即bit fields。這種類型的定義很像結構,但每個元素的數據類型都是匿名的,大小由位數指定。有一些開銷,但不會比你自己試圖實現更多;實際上,您讓編譯器完成這項工作。

如果您需要在結構後面的往復轉換整型之間(如長),​​你可以只(AB)使用的reinterpret_cast:

struct bitSet { 
    bitSet(long in1) { //ctor, eg bitSet tmpBit(input); 
    *this = reinterpret_cast<bitSet>(in1); 
    } 
    long toLong() { //eg output=tmpBit.toLong; 
    return reinterpret_cast<long>(*this); 
    } 

    unsigned U0 : 4; 
    unsigned U1 : 4; 
    unsigned U2 : 4; 
    unsigned U3 : 4; 
    unsigned U4 : 4; 
    unsigned U5 : 4; 
    unsigned U6 : 4; 
    unsigned U7 : 4; 
}; 

到這樣做的好處是,雖然你可以不能保證整型長度如此長,這確保每個元素只有4位長。

+0

但它並不能保證它會實際工作。字段的佈局是**實現定義**。您不能假定8個4位字段將佔用完全32位。 –