2013-01-09 51 views
1

我寫了一個函數,該函數應該從unsigned int中提取不穩定的位集。 我想爲此使用蒙版。我不確定定義此類蒙版的最佳方法是什麼。 例如,我需要提取位6:14。因此,我需要將掩碼定義爲111111111 << 6。 我的問題是我不能使用boost或類似的東西,標準的c/C++不知道使用二進制數字。 什麼是可能做的是使用111111111作爲2^10-1.I我不知道 - 這是最好的(最優雅的)解決方案。任何建議?定義掩碼的最佳方式

+0

問題不夠清楚。不要只告訴我們面具,告訴我們關於真正的問題。 – Nawaz

+0

您可以使用用戶定義的字符串文字。最近有大量的[類似的問題](http://stackoverflow.com/questions/14220217/)。 –

+0

http://stackoverflow.com/questions/537303/binary-literals? –

回答

1

只需使用0x1FF << 6(如果你想111111111 << 6)或0x3FF << 6(如果你想2^10-1 < < 6)。這比你的二進制文件更清晰 。正如Jerry Coffin指出的那樣,通過使用1 << 10可以很容易地得到2^10,但我不相信這比使用十六進制更清晰。 (對於這個問題, 在某些情況下,0x7FC00可能非常清楚,它具有 的優點,您可以直觀地看到單詞中的位爲 的位置,並且如果您有十六進制 轉儲,則更容易將它們選出。 )

3

大多數人都表示口罩,如0xFF時的0x0A等

1

時使用十六進制你訪問標準庫?如果是這樣,我會嘗試std::bitset

Here是它的文檔。

+3

如果問題標記爲[tag:C++],則可以安全地假定您可以使用標準庫,除非另有明確說明。 –

2

讓我們先試着做一堆。

二進制N序列的一個屬性是,就像十進制中的一串九進制一樣,如果給它添加一個序列,就會得到一個後接N個零的序列。我們可以使用反函數,事實是如果從一箇中減去一個,然後再加上N個零,就可以得到一個N個序列,來做到這一點。

一個跟着N個零是隻有1右移N個位置。

template <typename Uint> 
Uint zigamorph(int n) { // http://catb.org/jargon/html/Z/zigamorph.html 
    return 1 << n - 1; // same as 2^n - 1 :) 
} 

武裝與任何長度的zigamorphs,你可以很容易地通過使用逐,現在讓你從任何值所需的位。

template <typename Uint> 
Uint mask_bits(Uint value, int first_bit, int last_bit) { // both inclusive? 
    return value & zigamorph<Uint>(last_bit-first_bit+1); 
}