2016-09-30 66 views
2

這只是我想要的樂趣,沒有真正的實際使用它。C如何滾動字節

比方說我進入0xDEADAAAA

我希望能值轉換成0xDDEAAAAA

含義4個最顯著字節偏移超過一個字節。 而第四個最重要的字節現在成爲第一個最重要的字節。

有點像第4個字節的循環移位。

現在我在做

value = value >> ((sizeof(unsigned int) * 8)/2); 

這將所有字節偏移超過一個字節。 但是,我將如何做第四個最重要的字節到MSB的循環卷?

+0

一個字符串沒有「最重要的字節」。如果這應該是一個整數:它似乎只有4個字節。目前尚不清楚你的意思。看[問],提供[mcve]。並且搜索「c運營商」,如果這不是太多問。 – Olaf

+2

查看[Bit Twiddling Hacks](http://graphics.stanford.edu/~seander/bithacks.html)。您需要旋轉4個高位字節,同時保持低位字節不變(儘管AAAA的值位於低位字節,但很難發現保存字節值的處理不當的更改;使用「0xDEAD0123」或其他值而且,你似乎將字節與nybbles混合在一起;每個十六進制數字是一個nybble(又名半字節),看起來你想要處理4個最重要的nybbles,而不是字節 –

+0

這是一個無符號整數而不是一個字符串,我只是用十六進制表示它的可讀性 – momonkey7

回答

3

您可以將數字分成三部分並分別處理,然後合併它們。

未更改的部分是value & 0x0000FFFF
你想要右移4位的部分是value & 0xFFF00000
您想要左移12位的部分是value & 0x000F0000

所以做所有這些事情,然後用|合併結果:

value = (value & 0x0000FFFF) 
     | ((value & 0x000F0000) << 12) 
     | ((value & 0xFFF00000) >> 4); 

(注意,這裏我已經一字排開所有的面具,所以很容易看到,但顯然你沒有要做到這一點)