学校网站模板html/软文发布平台排名
题目
BUPT 2018 计算机 ProblemA
输入数据组数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转intfor(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;}
}
改进
今天在Leetcode上看到了更简单的解法
#include<bits/stdc++.h>
using namespace std;
int main()
{int t;cin>>t;for(int i=0;i<t;i++){long long int x;cin>>x;long long int res=0;int power=31;while(x){res+=(x&1)<<power;x=x>>1;power--;}cout<<res<<endl;}
}
小结
十进制转二进制
口诀:先模再除倒输出
代码:参考Day4-二进制
二进制转十进制
口诀:先乘再加
代码:
//二进制->十进制
long long int B2T(vector<int>b)
{long long int res=0;//存储十进制结果//先乘再加//过程很像string转int,只是10换成2for(int i=0;i<b.size();i++){res*=2;res+=b[i];}return res;//返回十进制
}