B3870 [GESP202309 四级] 变长编码【位操作的基本应用】

本题可以说是位操作的基本应用(不会也没事,用%和/照样可以过,但位操作的运行速度会更快):顺带科普一下位操作的基本应用,掌握的同学可以直接跳过

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;
 } 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值