2016-09-30 59 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); 

(注意,这里我已经一字排开所有的面具,所以很容易看到,但显然你没有要做到这一点)