2020-08-19

可以让你装逼的位运算

最近,在刷题的过程中,遇到一些需要用到位运算的题,感受到位运算的神奇之处后,突然觉得我以前忽略了位运算的作用了。位运算不但可以帮助我们理解程序执行过程的种种表现,提高程序运行的效率,而且还可以帮我们在无形中装逼,这种可以提高我们程序逼格的妙招,是不是想想都心动呢,哈哈哈~
在这里插入图片描述

位运算的概述

位运算是直接对二进制进行操作,我们常见的位运算包括以下几种:
在这里插入图片描述

位运算几个常用的技巧:

1.左移和右移的妙用

左移一次相当于,在之前的数上乘以2,而右移一次相当于,在之前的数上除以2,这个小技巧可以大大提高我们计算的效率。

5 << 2    
把二进制5向左推移两位,右边补0,也相当于是 5*2^2,向下取整。
5 >> 2  
把二进制5向右推移两位,左边补0,也相当于是5/2^2,向下取整。
2.x&(x-1)可以将二进制数最右边的 1 设置为 0
x=5=0101
5&4=0101 & 0100=0100
这个结论可以解决许多相关问题比如,用 O(1) 时间检测整数 n 是否是 2 的幂次;
计算在一个 32 位的整数的二进制表式中有多少个 1等。
3.判断奇偶数

使用 x & 1 == 1 判断奇偶数。

x = 6 , x & 1 = 0  
x = 7 , x & 1 = 1     
注意,一些编辑器底层会把用%判断奇偶数的代码,自动优化成位运算)
4.交换两个数

如果有哪位大佬不喜欢使用第三变量来交换两个数,可以来试试用异或来交换,无形中又可以装逼了

x = x ^ y 
y = x ^ y 
x = x ^ y

在这里插入图片描述

有关位运算的经典例题

这里选的题都比较简单,只是为了更方便讲解与位运算相关的知识,请大佬勿喷

在这里插入图片描述
这道题有很多种解法,这里我便学以致用,用上面学的知识来解:
如果 n 在二进制表示下末尾是1,则在答案中加1(用un & 1来判断un末尾是否为1);
将 n 右移一位,也就是将 nn 在二进制表示下的最后一位删掉(un>>=1);
迭代进行以上两步,直到n==0;

解题代码

#include<iostream>
using namespace std;

int main()
{
	int n;
    int res = 0;
    cin>>n;
    unsigned int un = n; 
    while (un) 
		res += un & 1, un >>= 1;
	cout<<res<<endl;
	return 0;
}

啊哈哈哈,大佬说太简单了,直接下一道,

在这里插入图片描述
这道题可能大家第一想法是直接计算,但是这道题给的数据范围是
在这里插入图片描述
直接计算的话,不可能得出正确的结果的,所以这道题需要位运算的一些技巧来解。这里以求4^20为例来讲解,20的二进制为10100,所以
在这里插入图片描述
在这里插入图片描述

利用3 ^ 1,不断累乘出3 ^ n(n为2、4、8、16)
每当累乘出一个3 ^ n,就查看其对应二进制位的值是1还是0,来决定是否要将它乘进最终结果,看到这里,相信各位大佬看出这道题其实用到的是快速幂算法。

废话不多说了,直接上代码

#include<iostream>
using namespace std;

long long int a,b,p;
int main()
{
	cin>>a>>b>>p;
	long long res=1%p;
	while(b)
	{
		if(b&1)
		res=a*res%p;
		a=a*a%p;
		b>>=1; 
	}
	cout<<res<<endl;
	return 0;
}

本来小何计划多写两道例题,但是考虑到这篇博客的篇幅已经很长了,所以只能作罢。啊哈哈哈,写到这里,相信各位大佬对位运算有了更深的了解了吧!!!

如果各位大佬喜欢小何写的博客,请为小何点赞啊,你们的支持就是对小何最大的鼓励!!!

在这里插入图片描述

为了实现Google Gmail注册功能,通常不会直接提供完整的源代码示例来创建Gmail账户。这是因为用户账户管理涉及敏感操作,应由官方服务处理以确保安全性和合规性。 然而,在开发与Gmail交互的应用程序时,可以利用OAuth 2.0协议授权流程来进行身份验证和访问控制[^3]。这允许第三方应用请求特定权限范围内的数据访问而无需知晓用户的密码。 对于希望集成Google登录或与其他Google服务互动的应用开发者来说,建议按照官方指南设置项目并启用必要的API接口: - 创建新的Google应用程序需前往Google API Console页面[^1]。 ```python import os from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'] def main(): """Shows basic usage of the Gmail API. Lists the user's Gmail labels. """ creds = None flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', SCOPES) creds = flow.run_local_server(port=0) service = build('gmail', 'v1', credentials=creds) results = service.users().labels().list(userId='me').execute() labels = results.get('labels', []) if not labels: print('No labels found.') else: print('Labels:') for label in labels: print(label['name']) if __name__ == '__main__': main() ``` 此Python脚本展示了如何通过OAuth 2.0认证过程连接到Gmail API,并列出当前用户的标签列表作为简单演示。请注意,实际部署前还需要考虑更多细节配置以及错误处理机制等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值