请教:把一个整数按二进制的形式进行反转,这样做对不对啊?谢谢。
就是加入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




