二进制与十进制的相互转换【进制转换】

  十进制数转换为二进制数

        十进制数转换为二进制数的基本方法是:对于整数采用“除2取余”,对于小数采用“乘2取整”。具体做法为:对于十进制数整数,用2连续除要转换的十进制整数及各次所得之商,直除到商等于0时为止,则各次所得之余数即为所求二进制整数由低位到高位的值;对于十进制小数,用2连续乘要转换的十进制小数及各次所得之积的小数部分,直乘到积的小数部分为0(或满足所要求的精度)时为止,则各次所得之积的整数部分即为所求二进制小数由高位到低位的值。当十进制数包含有整数和小数两部分时,可分别将整数和小数进行转换,后相加。

       例:将十进制数53.375转换成二进制数。

      

        于是, 53.375 = 110101.011B 。

     二进制数转换为十进制数

        二进制数转换为十进制数的基本方法是将二进制数的各位按权展开相加。

      例:  将二进制数11011.101转换成十进制数

        11011.101B =1×24+1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3

                            =16+8+0+2+1+0.5+0+0.125 =27.625

        于是, 11011.101B =27.625  。

例:逆序的二进制数

问题描述

把一个十进制整数转换成二进制,然后将其二进制倒过来得到的新的数的十进制是多少?

例如,十进制整数6的二进制数为110,逆序后为011,去掉前导0,得到的新数为11,对应的十进制数为3。

输入

输入第1行为一个整数T(1≤T≤100),表示测试用例的组数。

之后T行,每行为1个十进制整数X(0≤X≤2^31−1)。

输出

二进制数逆序后得到的新的十进制数。

输入样例

3

6

8

1

输出样例

3

1

1

思路:

        直接采用“除2取余”的方法将输入的十进制整数转换为二进制数保存到a数组中,a[0]保存二进制数的最低位。之后将数组a中保存的二进制数码按权值展开即得到逆序后的十进制数。

注:

小tip:去除前导0的方法:由于存储结果的数组已经将答案逆序,故只需找从位置0开始找第一个不为0的数,并指向它即可。    for(k=0;k<len&&a[k]==0;k++);  此代码进行实现;

例:数组a中的结果为0011时,k会指向序号为2的数;

#include <iostream>
using namespace std;
int main(int argc, char** argv) {
	int t;//组数 
	cin>>t;
	while(t--)
	{
		int n;//输入十进制数 
		cin>>n;
		int a[32];//存储转化后的二进制数,a[0]是最低位 
		int len=0;//存储数组长度 
		while(n!=0)//十进制转为二进制
		{
			a[len++]=n%2;
			n/=2;
		}
		int k;
		int ans=0;
for(k=0;k<len&&a[k]==0;k++);//去除前导0(逆序了二进制,然后搜寻前导0,k指向没有0的位置) 
	for(int i=k;i<len;i++) // 去掉前导0后,a[k]~a[len-1]正好是逆序后的二进制数
	{
		ans=ans*2+a[i]; //二进制转为十进制 
	}
	cout<<ans<<endl;
	}
	return 0;
}

如果觉得不错的话,点个赞在走吧。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值