2013-11-15 151 views
3

我正在做一個分配,在該分配中我需要將位寫入緩衝區,一旦緩衝區填充了8位,我就會刷新。 (霍夫曼壓縮)C++中的位緩衝區

我有一個問題,在輸入過程中分配/保存中間階段。所以我做了一些小測試,如

char buf = 0; 

cout << (buf | (1 << 1)); 
buf = (buf | (1 << 1)); 
cout << buf; 

但不明白爲什麼我不能保存中間階段。 ,它的輸出將是:

2"happy face" 

,而不是

22 

能否請你教教我如何保存中間階段?

基本上,我需要逐位寫入緩衝區,一旦緩衝區是一個字節,我會將其刷新到我的輸出文件。

+2

當找不到的時候,你應該嘗試使用無符號類型,它在許多情況下使事情變得更容易。 – PlasmaHH

回答

3

原因有點棘手 - 它與您寫入cout的表達式類型有關,而與您作爲按位表達式得到的值無關。

在第一種情況下,表達式是(buf | (1 << 1))。根據C++規則,該表達式的類型爲intOR的左側擴展爲與右側相匹配。

在第二種情況下,表達式的類型爲char,因爲操作已完成,結果已轉換回char

這就是爲什麼第一個值被解釋爲一個數字,而第二個值被解釋爲ASCII碼字符代碼爲2時,對應於打印在系統上的☺。添加演員應該可以解決這個問題。

2

要設置一個特定位,你可以使用此代碼:

buf |= 1 << n; // where n is bit number from 0 to 7 

要看到什麼是在buf將其轉換爲int,否則你會看到字符:

std::cout << int(buf); 

或者將其轉換由函數轉換爲二進制字符串。