位操作——高低位交换(循环左移/右移)

给出一个16位的无符号整数。称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。例如,数34520用二进制表示为:

      10000110 11011000

将它的高低位进行交换,我们得到了一个新的二进制数:

      11011000 10000110

它即是十进制的55430。

这个问题用位操作解决起来非常方便,设x=34520=10000110 11011000(二进制) 由于x为无符号数,右移时会执行逻辑右移即高位补0,因此x右移8位将得到0000000010000110。

而x左移8位将得到11011000 00000000。可以发现只要将x>>8与x<<8这两个数相或就可以得到11011000 10000110。用代码实现非常简洁:

x = (x>>8)|(x<<8)

扩展到一搬情形:

设sizeof(int)=32;

无符号整型变量循环右移k次的结果为:

a0a1......a               a31-k+1a31-k......a30a31a0.......a31-k

x = (x << 32-k) | (x >> k);

无符号整型变量循环左移k次的结果为:

x = (x >> 32-k) | (x << k);

posted @ 2015-06-25 09:25  Rosanne  阅读(7291)  评论(0编辑  收藏  举报