本题可以说是位操作的基本应用(不会也没事,用%和/照样可以过,但位操作的运行速度会更快):顺带科普一下位操作的基本应用,掌握的同学可以直接跳过
1、位与(&):将两个数的对应位进行与操作,只有当两个数的对应位都为1时,结果位才为1。
int result = 5 & 3; // 结果为 1 (0101 & 0011 = 0001)
2、位或(|):将两个数的对应位进行或操作,只要两个数的对应位中有一个为1,结果位就为1。
int result = 5 | 3; // 结果为 7 (0101 | 0011 = 0111)
3、位异或(^):将两个数的对应位进行异或操作,当两个数的对应位不相同时,结果位为1。
int result = 5 ^ 3; // 结果为 6 (0101 ^ 0011 = 0110)
4、位非(~):将一个数的每个位取反,即0变为1,1变为0。
int result = ~5; // 结果为 -6 (取反后的结果为 11111111111111111111111111111010)
5、左移(<<):将一个数的所有位向左移动指定的位数,右侧空出的位用0填充。
int result = 5 << 2; // 结果为 20 (5的二进制形式 0101 左移2位变为 10100)
6、右移(>>):将一个数的所有位向右移动指定的位数,左侧空出的位用用0填充(符号位保存不变)。
int result = 10 >> 1; // 结果为 5 (10的二进制形式 1010 右移1位变为 0101)
原题链接
题解:
#include<bits/stdc++.h>
using namespace std;
long long n;
void print(int x){
if(x<=9) cout<<x;
else cout<<char(x-10+'A');
}
int main()
{
cin>>n;
if(n==0) {
cout<<"00";
return 0;
}
while(n){
int t=n&0x7f;//任何数&0111 1111 获得后7位二进制值对应的十进制数
n=n>>7;//将处理好的后7位删去
if(n>0)//判断是否为最高位
t=t|0x80;//任何数|1000 0000 改写第8位为1
print((t>>4)&0xf);//输出高4位对应的16进制
print(t&0xf); //输出高低4位对应的16进制
cout<<" ";
}
return 0;
}