2012-03-24 26 views
0

你好是有一所學校分配的問題,我需要:按位bitmanipulation拼圖

看了輪數,以及與上從右向左和位7位0內部binaire代碼。

現在我需要改變: 位0與7位 位1與位6 第2位與5位 位3與位4

通過例如:

如果我使用十六進制F703變成F7C0 ,因爲03 = 0000 0011和C0 = 1100 0000 (只有正確的字節(8位)需要切換 問題是關於bitmanipulation,但我找不到一種方法來使它正確的16 hexnumbers。 enter image description here

I`am迷惑了現在詭計,

我想到了使用數組這個問題,或者有人可以說,我可以只按位^,&,〜做,< <,>> ,opertors ???

+1

什麼是您使用的代碼,這有什麼的例子一個它不適用的輸入? – 2012-03-24 22:59:36

+0

你在想這個問題都是錯誤的。不要認爲它是'十六進制數字' - 這意味着什麼?把它看作是以8位整數反轉位。我在下面的答案中給了你很多點擊。 – 2012-03-24 23:02:56

+0

如果有幫助,&運算符有一個非常漂亮的用法,可以讓你開始解決這個問題的一種方法。 – chris 2012-03-24 23:04:21

回答

0

研究以下兩個功能:

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

0

本質上你需要顛倒位排序。 我們不打算爲你解決這個問題..但這裏有一個提示:

如果你有一個2位的值,該怎麼辦?你將如何反轉這些位?

一個簡單的交換將工作,對吧?考慮如何使用可用的運算符對此交換進行編碼。

現在讓我們假設你有一個4位的值。你將如何反轉這些位?

你可以把它分成兩個2位的值,每一個都反過來,然後交換它們?這會給你正確的結果嗎?現在編碼。

推廣到8位值的解決方案現在應該是微不足道的。

祝你好運!

0

這可以做四分之一的工作,但我不會再給你任何幫助;如果你能弄清楚爲什麼我這麼說,那麼你應該可以填寫其餘的代碼。

if ((i^(i >> (5 - 2))) & (1 >> 2)) 
    i ^= (1 << 2) | (1 << 5);