将一个整数按照二进制形式逆序然后以整数形式输出

gaochizhen33 2011-12-28 09:39:31
计算机中数据是以二进制来保存的,如何先将一个数的二进制形式逆序,然后再把新得到的数用整数形式输出?
比如13表示为 1101, 逆序后位 1011,用整数形式输出结果为11。
...全文
707 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaochizhen33 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 hjf004 的回复:]
引用 25 楼 gaochizhen33 的回复:

引用 24 楼 hjf004 的回复:
引用 11 楼 i945800687 的回复:

引用 5 楼 hjf004 的回复:
+'0'和-'0'可以全部去掉,是测试输出的时候用到的……


好题,收藏了,晚上我自己做一下

-5 的朋友能解释一下+‘0’……为什么可以去掉吗?
“//偷个懒,不考虑符号位了...”,假设……
[/Quote]
客气了 补码形式的逆序跟无符号整数一样,他的存储已经有计算机给我们完成了,我现在觉得这个问题不需要考虑符号位的问题,我们只要保证将他在计算机中的二进制存储逆序就行了。只不过无符号整数验证起来比较直观,带符号位的整数在验证的时候不方便。
pupa 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 gaochizhen33 的回复:]

引用 24 楼 hjf004 的回复:
引用 11 楼 i945800687 的回复:

引用 5 楼 hjf004 的回复:
+'0'和-'0'可以全部去掉,是测试输出的时候用到的……


好题,收藏了,晚上我自己做一下

-5 的朋友能解释一下+‘0’……为什么可以去掉吗?
“//偷个懒,不考虑符号位了...”,假设要考虑的话应该如何处理呢?

考虑符号位的话就是这样……
[/Quote]
多谢提醒,汗,我给忽略了…
gaochizhen33 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 hjf004 的回复:]
引用 11 楼 i945800687 的回复:

引用 5 楼 hjf004 的回复:
+'0'和-'0'可以全部去掉,是测试输出的时候用到的……


好题,收藏了,晚上我自己做一下

-5 的朋友能解释一下+‘0’……为什么可以去掉吗?
“//偷个懒,不考虑符号位了...”,假设要考虑的话应该如何处理呢?

考虑符号位的话就是这样:

C/C++ code

#in……
[/Quote]
这种方法是错误的。要考虑实际负数的存储形式,是以补码的形式保存的,逆序也是要逆序他补码加1的值
pupa 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 i945800687 的回复:]

引用 5 楼 hjf004 的回复:
+'0'和-'0'可以全部去掉,是测试输出的时候用到的……


好题,收藏了,晚上我自己做一下

-5 的朋友能解释一下+‘0’……为什么可以去掉吗?
“//偷个懒,不考虑符号位了...”,假设要考虑的话应该如何处理呢?
[/Quote]
考虑符号位的话就是这样:

#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[32];
int num,i=0,abs_num,j,k,tmp;
printf("Please input a num:");
scanf("%d",&num);
abs_num=abs(num);
do
{
str[i]=abs_num%2; //只是为了临时存放一个数值,不需要+'0'转换成相应字符
abs_num/=2;
i++;
}
while(abs_num>1);
str[i++]=abs_num;
if(num<0)str[i]=1;
else
str[i]=0;
num=0;
for(j=1;j<=i;j++)
{
k=i-j;
tmp=1;
while(k--)tmp*=2;
num+=(str[j])*tmp;
}
num*=(str[0]>0?(-1):1);
printf("%d\n",num);
return 0;
}

改动不多,献丑了
赵4老师 2011-12-28
  • 打赏
  • 举报
回复
简化版
//计算机中数据是以二进制来保存的,如何先将一个数的二进制形式逆序,然后再把新得到的数用整数形式输出?
//比如13表示为 1101, 逆序后位 1011,用整数形式输出结果为11。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
int v;
char b[33],*ep;

scanf("%d",&v);//输入13回车
itoa(v,b,2);
strrev(b);
v=strtol(b,&ep,2);
printf("%d\n",v);//输出11
}
赵4老师 2011-12-28
  • 打赏
  • 举报
回复
简化版
//计算机中数据是以二进制来保存的,如何先将一个数的二进制形式逆序,然后再把新得到的数用整数形式输出?
//比如13表示为 1101, 逆序后位 1011,用整数形式输出结果为11。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
int v;
char b[33],*ep;

scanf("%d",&v);//输入13回车
itoa(v,b,2);
strrev(b);
v=strtol(b,&ep,2);
printf("%d\n",v);//输出11
}
赵4老师 2011-12-28
  • 打赏
  • 举报
回复
简化版
//计算机中数据是以二进制来保存的,如何先将一个数的二进制形式逆序,然后再把新得到的数用整数形式输出?
//比如13表示为 1101, 逆序后位 1011,用整数形式输出结果为11。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
int v;
char b[33],*ep;

scanf("%d",&v);//输入13回车
itoa(v,b,2);
strrev(b);
v=strtol(b,&ep,2);
printf("%d\n",v);//输出11
}
i945800687 2011-12-28
  • 打赏
  • 举报
回复
好题,收藏了

请问楼上各位大牛,如果要考虑符号位应该如何处理呢?
i945800687 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hjf004 的回复:]
+'0'和-'0'可以全部去掉,是测试输出的时候用到的……
[/Quote]

好题,收藏了,晚上我自己做一下

-5 的朋友能解释一下+‘0’……为什么可以去掉吗?
“//偷个懒,不考虑符号位了...”,假设要考虑的话应该如何处理呢?
赵4老师 2011-12-28
  • 打赏
  • 举报
回复
//计算机中数据是以二进制来保存的,如何先将一个数的二进制形式逆序,然后再把新得到的数用整数形式输出?
//比如13表示为 1101, 逆序后位 1011,用整数形式输出结果为11。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
int v,L,i;
char b[33],c,*ep;

scanf("%d",&v);//输入13回车
itoa(v,b,2);
L=strlen(b);
for (i=0;i<L/2;i++) {c=b[i];b[i]=b[L-i-1];b[L-i-1]=c;}
v=strtol(b,&ep,2);
printf("%d\n",v);//输出11
}
赵4老师 2011-12-28
  • 打赏
  • 举报
回复
//计算机中数据是以二进制来保存的,如何先将一个数的二进制形式逆序,然后再把新得到的数用整数形式输出?
//比如13表示为 1101, 逆序后位 1011,用整数形式输出结果为11。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
int v,L,i;
char b[33],c,*ep;

scanf("%d",&v);//输入13回车
itoa(v,b,2);
L=strlen(b);
for (i=0;i<L/2;i++) {c=b[i];b[i]=b[L-i-1];b[L-i-1]=c;}
v=strtol(b,&ep,2);
printf("%d\n",v);//输出11
}
赵4老师 2011-12-28
  • 打赏
  • 举报
回复
//计算机中数据是以二进制来保存的,如何先将一个数的二进制形式逆序,然后再把新得到的数用整数形式输出?
//比如13表示为 1101, 逆序后位 1011,用整数形式输出结果为11。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
int v,L,i;
char b[33],c,*ep;

scanf("%d",&v);//输入13回车
itoa(v,b,2);
L=strlen(b);
for (i=0;i<L/2;i++) {c=b[i];b[i]=b[L-i-1];b[L-i-1]=c;}
v=strtol(b,&ep,2);
printf("%d\n",v);//输出11
}
gqjjqg 2011-12-28
  • 打赏
  • 举报
回复


INT32 i = 32, i32OutPut = 0;
INT32 i32Value;
scanf("%d", & i32Value);

while (i--) {
i32OutPut |= (((i32Value >> i) & 1) ? (1 << (32 - i)) : 0;
}

printf("%d\n", i32OutPut);



没测试。
gqjjqg 2011-12-28
  • 打赏
  • 举报
回复


INT32 i = 32, i32OutPut = 0;
INT32 i32Value;
scanf("%d", & i32Value);

while (i--) {
i32OutPut |= (((i32Value >> i) & 1) ? (1 << (32 - i)) : 0;
}

printf("%d\n", i32OutPut);



没测试。
pupa 2011-12-28
  • 打赏
  • 举报
回复
+'0'和-'0'可以全部去掉,是测试输出的时候用到的……
pupa 2011-12-28
  • 打赏
  • 举报
回复
+'0'和-'0'可以全部去掉,是测试输出的时候用的……
pupa 2011-12-28
  • 打赏
  • 举报
回复
我来抛砖引玉吧……

#include<stdio.h>
int main()
{
char str[31];//偷个懒,不考虑符号位了...
int num,i=0,j,k,tmp;
printf("Please input a num:");
scanf("%d",&num);
do
{
str[i]=num%2+'0';
num/=2;
i++;
}
while(num>1);
str[i]=num+'0';
num=0;
for(j=0;j<=i;j++)
{
k=i-j;
tmp=1;
while(k--)tmp*=2;
num+=(str[j]-'0')*tmp;
}
printf("%d\n",num);
return 0;
}

hldc 2011-12-28
  • 打赏
  • 举报
回复

乱搞一个,请指正


#include <string.h>
#include <stdio.h>

void reverse(char *s);

int main()
{
int i,j,k;
char buffer[256];

printf("Input:");
scanf("%d",&i);
itoa(i,buffer,2);
printf("%s\n",buffer);
reverse(buffer);
printf("\n%s",buffer);
j=0;
k=0;
while(buffer[k++]!='1'){ ;}
k--;
while(buffer[k])
{
j=j*2+(buffer[k]-'0');
k++;

}
printf("\n**%d**",j);


}

void reverse(char *s)
{
char ch,*p1=s;
int size = strlen(s);
char *p=s+size-1;
while(p>=p1)
{ ch=*p;
*p--=*p1;
*p1++=ch;
};

}


pupa 2011-12-28
  • 打赏
  • 举报
回复
果然又可以学到不少东西了……为什么少了很多楼的样子,CSDN怎么了……
new_buffer 2011-12-28
  • 打赏
  • 举报
回复
楼主,你说的是这个意思吧。你参考下 VC6.0下编译通过

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void main()
{
int nValue;
printf("请输入一个数字:");
scanf("%d",&nValue);

char buf[32] = {0};
itoa(nValue,buf,2);
printf("%d 的二进制数为:%s\n",nValue,buf);

int len = strlen(buf) - 1;
for(int i = 0; i < len;i++)
{
char ch = buf[i];
buf[i] = buf[len] ;
buf[len--] = ch;
}
printf("逆序后二进制字符串:%s\n",buf);

char *p = buf;
int sum = 0;
len = strlen(buf) - 1;
for(i = len;i >=0; i--)
{
int value = (*(p + i) == '1' ? 1 : 0);
sum += value * pow(2,len - i);
}
printf("此时的二进制转为十进制值为:%d\n\n",sum);

printf("OK,祝你好运\n\n");
system("pause");
}
加载更多回复(6)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧