Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330328
  • 博文数量: 243
  • 博客积分: 86
  • 博客等级: 民兵
  • 技术积分: 1045
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-09 17:03
个人简介

稳重,成熟

文章分类

全部博文(243)

文章存档

2015年(2)

2013年(72)

2012年(169)

我的朋友

分类: C/C++

2012-11-19 18:55:27

方法一:

点击(此处)折叠或打开

  1. //二进制逆序
  2. //程序读入一个32位整数并输出它的二进制倒序后所表示的数
  3. #include <stdio.h>

  4. int main() {
  5.     int n;
  6.     while (scanf("%d", &n) != EOF) {
  7.         n = (n & 0x55555555) << 1 | (n & 0xAAAAAAAA) >> 1;
  8.         n = (n & 0x33333333) << 2 | (n & 0xCCCCCCCC) >> 2;
  9.         n = (n & 0x0F0F0F0F) << 4 | (n & 0xF0F0F0F0) >> 4;
  10.         n = (n & 0x00FF00FF) << 8 | (n & 0xFF00FF00) >> 8;
  11.         n = (n & 0x0000FFFF) << 16 | (n & 0xFFFF0000) >> 16;
  12.         printf ("%d\n", n);
  13.     }
  14.     return 0;
  15. }
  16. 其实,这种方法很好理解,上面的意思就是通过移位,先两两交换。看下图就明白其中的原理了。
  17. 假如一个8位的二进制数,就是如图所示:11 10 01 00 先1跟1交换,1跟0交换,0跟1交换 0跟0交换。
  18. 第二步就是11 与01交换。。。最后,得出所需要的结果。 16位及32位类似。
                
     
这种方法的好处就是:直观明了,一步一步的往下执行。
方法二:

点击(此处)折叠或打开

  1. int reverse( int n )
  2. {
  3.     unsigned int tmp;
  4.     unsigned int maskl=0x01;
  5.     unsigned int maskh=0x80000000;
  6.     unsigned int rst=0;
  7.     int i,j;
  8.     for(i=0;i<15;i++)
  9.     {
  10.           tmp=n&maskl;
  11.           maskl=maskl<<1;
  12.           for(j=i+1;j<=31-i;j++)
  13.                 tmp=tmp<<1;
  14.           rst=tmp | rst;
  15.     }
  16.     for(i=0;i<15;i++)
  17.     {
  18.           tmp=n&maskh;
  19.           maskl=maskh>>1;
  20.           for(j=i+1;j<=31-i;j++)
  21.                 tmp=tmp>>1;
  22.           rst=tmp | rst;
  23.     }
  24.     return rst;
  25. }
这种方法也是类似。先取出高位或者低位,再按位或。


阅读(1401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~