位操作——高低位交换(循环左移/右移)
给出一个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);