算法--位运算

来源:互联网 发布:爸爸网络用语怎么叫 编辑:程序博客网 时间:2024/05/17 07:10

基本运算

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 ^= bb ^= aa ^= 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 //对一个数取两次异或会返回原值,也可用于加密

数组中,只有一个数出现一次,剩下都出现三次,找出出现一次的数

??????
原创粉丝点击