我目前正在研究一個需要我存儲32位模式並分析它的項目。我需要一種方法將例如「1001 1001 1100 1000」這樣的模式存儲在變量中,例如,它不會被重新解釋爲char。在C++中存儲字節模式
回答
在C++ 03中,我會使用unsigned int
或unsigned long
,但都沒有被指定爲完全32位。 unsigned long
被指定爲能夠保持至少的值[0,2 -1],所以理論上它可以是大於32個比特。在C++ 11中,我會使用uint32_t
;
例如0000 0000 0000 0000 1001 1001 1100 1000
是0x99c8
,其中0x
是十六進制前綴。
uint32_t bitpattern = 0x998c
如果變量bitpattern
包含所需的位模式,你想流呢安慰爲十六進制數,你會使用這樣的:
std::cout << std::hex << bitpattern;
你應該提到'uint32_t'被標準標記爲可選。爲了完全安全,請使用'uint_least32_t'。 –
你一定要明白的是,模式不是32位,對吧?
既然不是,像
unsigned long pattern = 0x99c8;
應該是非常安全的,你會很難找到一個平臺,讓unsigned long
小於16位。萊克阿爾門說,如果你有uint32_t
,使用它。
「長」總是至少32位寬。 – avakar
如果你想在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();
除了試圖使用一體型和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位長。
但它並不能保證它會實際工作。字段的佈局是**實現定義**。您不能假定8個4位字段將佔用完全32位。 –
- 1. C#在字節數組中存儲int
- 2. 在類中存儲字節[]
- 3. C中的字節如何存儲?
- 4. c中的存儲庫模式#
- 5. C在一個字節中存儲2個數字
- 6. 字節[]要存儲在Oracle
- 7. C#:將字節數組存儲爲XML
- 8. 存儲庫:C#中裝飾器/存儲庫模式的示例#
- 9. 如何在varbinary中存儲16000字節
- 10. JSON響應與字節[],如何在C#中存儲爲文件?
- 11. C#在資源中存儲二進制流(或字節數組)
- 12. 如何在C中存儲字節數組?
- 13. double如何在C++中以8個字節存儲1024位?
- 14. 存儲字節在寄存器變量
- 15. 在C++或c中存儲大數字
- 16. 將8字節值的每個字節存儲在數組中
- 17. obj-c/ios中可以存儲128千字節的字符數?
- 18. 枚舉存儲庫模式c#
- 19. npm存儲節點模塊在哪裏?
- 20. c#存儲庫模式:每個子類有一個存儲庫?
- 21. 將細節存儲到C結構中
- 22. Avro模式存儲
- 23. 存儲庫模式
- 24. 在Vue.js中實現存儲模式
- 25. 在Python中實現存儲庫模式?
- 26. 何處在Apache Solr中存儲模式?
- 27. 存儲庫模式在asp中。 net mvc3
- 28. 模式存儲在哪個表中?
- 29. 在MVC中設置存儲庫模式
- 30. 如何在訪問者模式的節點上存儲狀態?
'uint32_t x = 0x99c8;' – avakar
@avakar - 'uint_least32_t'更便攜。 'unsigned long'更是如此。 –