二进制按位翻转

来源:互联网 发布:cocos2dx安装 mac 编辑:程序博客网 时间:2024/06/01 08:16

二进制按位翻转

把一个32位整数按位反转,即第1位转到第32位,第2位转到第31位,依次下去。
算法实现:                                                      0XAAAAAAAA之类的称为掩码

第一行以1位为一单元,奇偶单元进行交换; (交换32位整数的奇数位偶数位)

第二行以2位为一单元,奇偶单元进行交换;

第三行以4位为一单元,奇偶单元进行交换;

第四行为8位为一单元,奇偶单元进行交换;

第五行以16位为一单元,奇偶单元进行交换。

至此,32位反转完成,算法结束。

 

#include <stdio.h>void print(unsigned int data){int count = 0;int k = sizeof(data)*8 - 1;/*将1依次左移31-0位至最低位,得出其31-0位,是1则输出1,是0则输出0*/for (; k>=0; --k){printf("%d", ((data >> k) & 1));++count;if (count % 8 == 0){printf(" ");}}printf("\n");}unsigned int bitReverse(unsigned int data){/*data = ((data >> 1) & 0X55555555) | ((data << 1) & 0XAAAAAAAA);print(data);data = ((data >> 2) & 0X33333333) | ((data << 2) & 0XCCCCCCCC);print(data);data = ((data >> 4) & 0X0F0F0F0F) | ((data << 4) & 0XF0F0F0F0);print(data);data = ((data >> 8) & 0X00FF00FF) | ((data << 8) & 0XFF00FF00);print(data);data = ((data >> 16) & 0X0000FFFF) | ((data << 16) & 0XFFFF0000);print(data);*/data = ((data & 0XAAAAAAAA) >> 1) | ((data & 0X55555555) << 1);print(data);data = ((data & 0XCCCCCCCC) >> 2) | ((data & 0X33333333) << 2);print(data);data = ((data & 0XF0F0F0F0) >> 4)  | ((data & 0X0F0F0F0F) << 4);print(data);data = ((data & 0XFF00FF00) >> 8)  | ((data & 0X00FF00FF) << 8);print(data);data = ((data & 0XFFFF0000) >> 16) | ((data & 0X0000FFFF) << 16);print(data);return data;}int main(void){unsigned int data;while (scanf("%u", &data) != EOF){printf("0X%08X\n", data);print(data);data = bitReverse(data);printf("0X%08X\n", data);printf("%#08X\n", data); /*和上个结果一样,C和指针P314*/}return 0;}


 

0 0
原创粉丝点击