CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

请教:把一个整数按二进制的形式进行反转,这样做对不对啊?谢谢。

楼主networkhunter(土豆土豆我是地瓜)2006-05-03 00:36:11 在 C/C++ / C语言 提问

就是加入25这个数,  
  它的二进制形式是:  
   
  00000000   00000000   00000000   00011001  
  反转之后就是:  
  10011000   00000000   00000000   00000000  
  并打印出反转之后这个数的十进制的形式。  
  下边的是我做的程序,请问像下边这样做对吗?有没有走弯路啊?还能不能进一步的优化啊?谢谢。  
   
   
  #include   <stdio.h>  
   
   
  void   intToBit(char   *bit,int   data)  
  {  
  int   temp=data;  
  int   i;  
  for(i=0;i<32;i++)  
  {  
  if((temp&0x80000000)==0)  
  {  
  bit[i]='0';  
  }  
  else  
  {  
  bit[i]='1';  
  }  
  temp=(temp<<1);  
  }  
  }  
   
  printBitArray(char   *bit)  
  {  
  int   j;  
   
  for   (j=0;j<32;j++)  
  {  
  printf("%c",bit[j]);  
  if((j+1)%8==0)  
  {  
  printf("   ");  
  }  
  }  
  printf("\n");  
  }  
   
  void   symmetricalSwitch(char   *bit)  
  {  
  char   temp;  
  int   i;  
  int   j;  
  for(i=0,j=31;i<16;i++,j--)  
  {  
  temp=bit[i];  
  bit[i]=bit[j];  
  bit[j]=temp;  
  }  
  }  
   
  unsigned   int   bitToInt(char   *bit)  
  {  
  int   i;  
  unsigned   int   data=0;  
  for   (i=0;i<32;i++)  
  {  
  data=data<<1;  
   
  if(bit[i]=='1')  
  {  
  data=data|1;  
  }  
  else  
  {  
  data=data|0;  
  }  
  //printf("%x\n",data);     //调试用语句。  
  }  
  return   data;  
  }  
   
  main()  
  {  
  char   bit[32];  
  int   data;  
  int   temp;  
  printf("请输入一个数:");  
  scanf("%d",&data);  
  printf("\n");  
  temp=data;  
  intToBit(bit,data);  
  printf("其未反转之前的二进制形式表示:\n");  
          printBitArray(bit);  
  symmetricalSwitch(bit);  
  printf("反转之后的二进制形式表示:\n");  
  printBitArray(bit);  
  printf("其反转后的十进制形式为:%u",bitToInt(bit));  
  printf("\n");  
  } 问题点数:10、回复次数:7Top

1 楼networkhunter(土豆土豆我是地瓜)回复于 2006-05-03 09:55:22 得分 0

怎么没有人帮我看看吗?Top

2 楼du51(郁郁思扬)回复于 2006-05-03 10:22:08 得分 2

#include<stdio.h>  
  #include<stdlib.h>  
  const   int   LEN=sizeof(int)*8;  
  unsigned   int   change(unsigned   int   n)  
  {  
          int   i;  
          unsigned   int   offset=1;  
          unsigned   int   result=0;  
          for(i=0;i<LEN;i++,offset<<=1)  
          {  
                  result=result*2+((offset&n)?1:0);  
          }  
          return   result;  
  }  
  void   showbit(unsigned   int   n)  
  {  
          unsigned   int   offset=1<<(LEN-1);  
          int   i;  
          for(i=0;i<LEN;i++,offset>>=1)  
          {  
                  printf("%d",((offset&n)?1:0));  
          }  
          printf("\n");  
  }  
  int   main()  
  {  
          unsigned   int   n=11;  
          showbit(n);  
          showbit(change(n));  
          system("PAUSE");  
          return   0;  
  }Top

3 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-05-03 11:09:27 得分 2

有几个函数中的判断是不必要   的。  
   
  #include   <stdio.h>  
   
   
  //void   intToBit(char   *bit,int   data)两者本质上没有差别,但数组形式给看程序带来方便  
  void   intToBit(char   bit[32],int   data)  
  {  
  int   i;  
  for(i=0;i<32;++i)  
  {  
  bit[31-i]=(data>>i)&1;  
  }  
  }  
   
  void   printBitArray(char   bit[32])  
  {  
  int   j;  
   
  for   (j=0;j<32;++j)  
  {  
  printf("%d",bit[j]);  
  if((j+1)%8==0)  
  {  
  printf("   ");  
  }  
  }  
  printf("\n");  
  }  
   
  void   symmetricalSwitch(char   bit[32])  
  {  
  char   temp;  
  int   i;  
  int   j;  
  for(i=0,j=31;i<16;i++,j--)  
  {  
  temp=bit[i];  
  bit[i]=bit[j];  
  bit[j]=temp;  
  }  
  }  
   
  unsigned   int   bitToInt(char   bit[32])  
  {  
  int   i;  
  unsigned   int   data=0;  
  for   (i=0;i<32;++i)  
  {    
  data=data<<1;  
  data=data|bit[i];  
  }  
  return   data;  
  }  
   
  main()  
  {  
  char   bit[32];  
  int   data;  
  int   temp;  
  printf("请输入一个数:");  
  scanf("%d",&data);  
  printf("\n");  
  temp=data;  
  intToBit(bit,data);  
  printf("其未反转之前的二进制形式表示:\n");  
          printBitArray(bit);  
  symmetricalSwitch(bit);  
  printf("反转之后的二进制形式表示:\n");  
  printBitArray(bit);  
  printf("其反转后的十进制形式为:%u",bitToInt(bit));  
  printf("\n");  
  return   0;  
  }  
  Top

4 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2006-05-03 11:55:35 得分 2

都比较复杂:  
  我来个简洁的.  
   
  int   a=13;    
  int   b;  
   
  int   i;  
  for(i=0;i<32;++i)  
  {  
        b|=(a   &   0x01)<<(31-i);  
        a>>=1;  
  }  
   
  Top

5 楼Ninstein(www.Ninstein.Com)回复于 2006-05-04 11:38:52 得分 2

for(i=0;i<32;++i)  
  改成for(i=0;i<sizeof(int)*8;++i)  
  移植性好点Top

6 楼niatclock(豆豆雅)回复于 2006-05-04 17:28:49 得分 0

MARKTop

7 楼cunsh(村少)回复于 2006-05-04 17:51:15 得分 2

用bitset  
  unsigned   int   u   =   123u;  
  bitset<32>   x(u);  
  string   s   =   x.to_string();  
  reverse(s.begin(),   s.end()   );  
  u     =   bitset<32>(s).to_ulong();  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:networkhunter
  • du51
  • A_B_C_ABC
  • sankt
  • Ninstein
  • cunsh

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo