2017-06-20 53 views
1

我正在學習位操作,然後我想到了這一點。假設我有兩個數字,第一個在[1,6]的範圍內,第二個在[0,3]的範圍內。現在第一個數字可以存儲最多3位數據,第二個數據可以存儲2位數據。我怎樣才能使用一個int32來存儲它們。謝謝。如何使用位操作在一個整數中編碼和解碼兩個數字?

+0

您也可能有興趣看[bit feilds](http://en.cppreference.com/w/cpp/language/bit_field) – NathanOliver

回答

2

會做到這一點。

second_number然後佔用兩個最低有效位,你可以用composite & 3提取它。

first_number佔據了三位,即「左」,你可以用composite >> 2提取它。

+0

感謝您的回答。可以編碼兩個以上的數字嗎? –

+1

當然可以。您只需使用更多的按位運算符進行提取。 @nglee的答案更容易概括。 – Bathsheba

6

編碼:

// a : range of [1,6], bit0 ~ bit2 
// b : range of [0,3], bit3 ~ bit4 
// c : encoded int32 
c = 0; 
c |= (a | b << 3); 

解碼:

a = (c & 0x00000007); 
b = (c & 0x00000018) >> 3; 
+0

有一個upvote:你的代碼比我的更專業,特別是'a | b << 3'這是您的運營商優先級知識的試金石。 – Bathsheba

+0

@Bathsheba謝謝,但我喜歡你的乘法和除法的想法。 (猜猜它現在被編輯了)它看起來比這個更簡單。 – nglee

+0

這就是我的想法,但我認爲使用按位運算符有點不特別。您已經注意記錄它,您的答案仍然優越。 (有趣的是,我們如何把這兩個數字放在不同的地方,那麼Endianness戰鬥是如何開始的?) – Bathsheba

2

如果你只需要打包成一個INT兩個數字,而不是位操作你可能想使用bit fields。這樣你就可以在一個int字段的空間中存儲兩個字段並通過名稱訪問它們。

+0

我想通過網絡發送數據,它必須是int。我在這裏有一些限制。謝謝。 –

+1

@Ankitsinghkushwah它可以採取完全大小的int值存儲,只是要小心簽署/無符號。你可以在這裏檢查它:http://cpp.sh/6q73k也許它會幫助你另一次:) – Michael232

+0

請注意,位域的佈局是特定於實現的。不要求包含兩個小字段的結構必須適合'int'。這通常是完成的,但不能保證。 –

相關問題