题目
输入数据组数t,每组数据输入一个十进制数x(0<x<2^32),将其二进制位反转(共32位),然后输出对应的十进制数
提示
2^32-1超出了int的范围,请使用long long
示例
输入
2
2
3
输出
1073741824
3221225472
题解
很好的一道题,练习了十进制转二进制和二进制转十进制
需要注意的是,十进制转二进制用的这个算法得到的二进制本身就是反转的,因此本题得到二进制之后直接转成十进制就是所求结果
但是如果需要正确的二进制结果需要倒序输出
#include<bits/stdc++.h>
using namespace std;
//十进制->反转的二进制
//结果用数组存储,作为返回值
vector<int> T2B(long long int x)
{
int i;
vector<int>b(32);//存储二进制反转结果
//十进制转二进制这个算法的结果本身就是反转的二进制
for(i=0;x>0;i++)
{
b[i]=x%2;
x/=2;
}
return b;
}
//二进制->十进制
long long int B2T(vector<int>b)
{
long long int res=0;
//过程很像string转int
for(int i=0;i<b.size();i++)
{
res*=2;
res+=b[i];
}
return res;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
long long int x;
cin>>x;
vector<int>bin=T2B(x);
cout<<B2T(bin)<<endl;
}
}
小结
十进制转二进制
口诀:先模再除倒输出
代码:参考Day4-二进制
扫描二维码关注公众号,回复:
12675529 查看本文章
二进制转十进制
口诀:先乘再加
代码:
//二进制->十进制
long long int B2T(vector<int>b)
{
long long int res=0;//存储十进制结果
//先乘再加
//过程很像string转int,只是10换成2
for(int i=0;i<b.size();i++)
{
res*=2;
res+=b[i];
}
return res;//返回十进制
}