位运算的技巧&习题整合

一、位运算概述:

此部分内容摘自:位运算(&、|、^、~、>>、 | 菜鸟教程

由此,由于位运算的效率高以及占用内存少,它常常用于状态压缩&优化运算模式

※各个运算符的常见用途:

①与运算符:

如果想要找一个低4位为1的数字,只需要找一个像10000这样的数字-1即可

而且对于(2),与运算也常常为了取右数第n位(最右边为第0位),让1<<n然后与原数作与运算

②或运算符:常常用来把某一位设置为1

③异或运算:与(1<<n)进行异或即可对右边第n位取反,与0异或值不变。

由此——对两个数作值交换的时候,更加快的方法是使用位运算:(注意,纯从形式上来看的话,这三个式子的右边都是不变的,左边的话交替出现a和b就可)

a=a^b;b=a^b;a=a^b;

 而且这种的交换值的运算,比用temp交换值要快不少,提升在W级就挺明显了

④取反——要注意是所有位都取反!比较典型的应用场景:使一个数的最低位为零

使a的最低位为0,可以表示为:a & ~1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为" ~"运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

二、位运算的一些典型的应用场景:

①0和1表示两种状态,那么如果要表示第三种状态的话,用10即可

②典型式——n&(n-1)

应用场景一:判断是否为2的幂

 这里所谓的高位,指的是比借位点更高的那些位!

应用场景二:判断某个数的二进制表示中1的个数

n与n-1做一次与运算,就会消掉最低位的1

比如观察这两个数——我们知道1000000-1=0111111,也就是最低位的1和最低位的1右边的数在经过与运算之后都会归0。由此我们可以不断地做与运算,直到整个数字为1,就可以统计出这个数字在二进制表示下的总的1的个数!

※对于求解二进制中1的个数,更快的方式是直接调用__builtin_popcount(int n)函数来处理

如果n是long long类型——使用__builtin_popcountll(long long n)这个函数来做即可

应用场景三、求解N!中二进制数的个数——

③一个很重要的数学规律——能被2的偶数次幂(不是指的4的倍数!),与3作取模运算,值为1;能被2的奇数次幂整除的,与3作取模运算,值为2。也就是:

 由此,再结合对于2的幂的判断的位运算技巧,可知判断是否为4的幂的书写可以是:

 ④对于异或运算符的更深理解——两个数异或,相当于没有进位的加法

因为两个1凑起来,如果是加的话,这个位变为0,高位+1,只是此时做了异或之后只完成了这个位变为0的操作。

再看1和0异或,还为1,1+0也为1,没有发生进位,等效

0和0异或,还是为0,加法也一样。

所以两个数作加法还可以表示为:不带进位的加和(异或)+纯进位的部分

之所以(a&b),就是因为只有当a和b的那一位均为1的时候,相加才需要进位进1,所以左移一位

⑤求幂的更好更快的方法——1<<n,相当于2的n次方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值