研究以下兩個功能:
bool GetBit(int value, int bit_position)
{
return value & (1 << bit_position);
}
void SetBit(int& value, int bit_position, bool new_bit_value)
{
if (new_bit_value)
value |= (1 << bit_position);
else
value &= ~(1 << bit_position);
}
所以現在我們可以讀取和寫入任意位就像是一個數組。
1 << N
爲您提供:
000...0001000...000
凡1處於第N位置。
所以
1 << 0 == 0000...0000001
1 << 1 == 0000...0000010
1 << 2 == 0000...0000100
1 << 3 == 0000...0001000
...
等。
現在如果我將BINARY和上述其中一個數字與其他數字Y相比會發生什麼?
X = 1 << N
Z = X & Y
Z將會是什麼樣子?那麼除了N之外,每一點都肯定會是0不是嗎?因爲這些位在X中爲0。
Z的第N位是什麼?它取決於Y的第N位的值不是嗎?那麼在什麼情況下Z零點?正確地說,當Y的第N位是0.因此,通過將Z轉換爲布爾值,我們可以分離出Y的第N位的值。再看看上面的GetBit函數,這正是它正在做的。
現在這就是閱讀位,我們如何設置一點?那麼,如果我們要設置一下就可以使用二進制或從上述(1 < < N)號碼:
X = 1 << N
Z = Y | X
什麼是Z-會來這裏?那麼除了第N個右邊以外,每個位都將與Y相同?第N位始終爲1.所以我們設置了第N位。
將位設置爲零怎麼樣?我們想要做的就是取一個像11111011111這樣的數字,其中第N位關閉,然後使用BINARY AND。爲了得到這樣一個數字,我們只是使用二進制NOT:
X = 1 << N // 000010000
W = ~X // 111101111
Z = W & Y
因此,所有的從第Nž分開位將是Y的副本第N將永遠關閉。所以我們有效地將第N位設置爲0.
使用上述兩種技術是我們如何實現SetBit。
所以現在我們可以讀寫任意位。現在我們可以像數組中那樣反轉數字的位:
int ReverseBits(int input)
{
int output = 0;
for (int i = 0; i < N; i++)
{
bool bit = GetBit(input, i); // read ith bit
SetBit(output, N-i-1, bit); // write (N-i-1)th bit
}
return output;
}
請確保你理解了所有這些。一旦你理解了這一切,請關閉頁面並實施並測試它們,而不必看它。
如果你喜歡這比嘗試下列:
http://graphics.stanford.edu/~seander/bithacks.html
和/或得到這本書:
http://www.amazon.com/exec/obidos/ASIN/0201914654/qid%3D1033395248/sr%3D11-1/ref%3Dsr_11_1/104-7035682-9311161
什麼是您使用的代碼,這有什麼的例子一個它不適用的輸入? – 2012-03-24 22:59:36
你在想這個問題都是錯誤的。不要認爲它是'十六進制數字' - 這意味着什麼?把它看作是以8位整數反轉位。我在下面的答案中給了你很多點擊。 – 2012-03-24 23:02:56
如果有幫助,&運算符有一個非常漂亮的用法,可以讓你開始解決這個問題的一種方法。 – chris 2012-03-24 23:04:21