算法--位运算

基本运算

bin(num)    #将十进制整数取二进制
a & b       #位与,(5 & 9 = 1) => (0101 & 1001 = 0001)
a | b       #位或,(5 | 9 = 13) => (0101 | 1001 = 1101)
a ^ b       #位异或(半加),(5 ^ 9 = 12) => (0101 ^ 1001 = 1100)
~a         #位取反 (~5 = -6) => (~1 0101 = 0 1010)
a << b      #左移位(a乘以b个2) (5 << 2 = 20) => (101 << 2 = 10100)
a >> b      #右移位(a除以b个2) (5 >> 2 = 1) => (101 >> 2 = 1)

常用算法

//交换两个变量
a ^= b
b ^= a
a ^= b

//java获取int最大值
(1 << 31) - 1
~(1 << 31)

//java获取int最小值
(1 << 31)

//判断一个数的奇偶性
(n & 1) == 1

//计算平均数
(x + y) >> 1

//取相反数
~n + 1

一些有趣的问题

判断是否为2的幂次:

2的幂次的二进制必然只有一个1,其余为0。将该值减去1,就会将原本是1的那位变成0。这个数按位与一定是0。

n > 0 && (n & (n - 1) == 0

计算在一个 32 位的整数的二进制表式中有多少个 1:

由x & (x - 1)消去x最后一位的1可知。不断使用 x & (x - 1) 消去x最后一位的1,计算总共消去了多少次即可。

def count(num):
    cou = 0
    while num != 0:
        num = num & (num - 1)
        cou += 1
    return cou
数组中,只有一个数出现一次,剩下都出现两次,找出出现一次的数:

只要将所有数字异或起来,出现2次的数字不影响,留下只出现一次的数字

a ^ b ^ b = a //对一个数取两次异或会返回原值,也可用于加密

数组中,只有一个数出现一次,剩下都出现三次,找出出现一次的数
??????
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值