二进制遍历 python

二进制的运算

按位与运算 &
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

左位运算
# 左位运算
# a << b 将a转化为二进制后,左移b个位置,即在后面添加b个0 == a * 2^b
print(1<<3) #1000 2^3  8  
print(3<<3) #11000 2^4+2^3=24
右位运算
# 右位运算 用来判断该位置是否有1
# (
# 位置编号 从右往左 即 3 2 1 0
print((1100 >>0) & 1) #0   print((12 >>0) & 1)
print((1100 >>1) & 1) #0   print((12 >>1) & 1)
print((1100 >>2) & 1) #1   print((12 >>2) & 1)
print((1100 >>3) & 1) #1   print((12 >>3) & 1)

全排列
nums=['a','b','c','d']
# 取子集 全排列 
def fun(nums):
    n=len(nums)
    ans=[]
    for i in range(1<<n):
        path=[]
        for j in range(n):
            if (i>>j)&1 : #判断第j位是1,则符合
                path.append(nums[j])
        ans.append(path[:])            
    print(len(ans),ans)
    
fun(nums)

结果:

16 [[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], 
	['b', 'c'], ['a', 'b', 'c'], ['d'], ['a', 'd'], 
	['b', 'd'], ['a', 'b', 'd'], ['c', 'd'],
	 ['a', 'c', 'd'], ['b', 'c', 'd'], ['a', 'b', 'c', 'd']]
组合

从n个数中取出来k个

# 组合 从n个数中取出来k个
def fun(nums,k):
    n=len(nums)
    ans=[]
    for i in range(1<<n):
        path=[]
        cnt=0
        for j in range(n):
            if (i>>j)&1 : #判断第j位是1,则符合
                path.append(nums[j])
                cnt+=1
            if cnt>k: #提前剪枝
                break
        if cnt==k:ans.append(path[:])            
    print(len(ans),ans)
    
fun(nums,2)

结果:

6 [['a', 'b'], ['a', 'c'], ['b', 'c'], ['a', 'd'], ['b', 'd'], ['c', 'd']]
组合2

从n个数中取出来0-k个

# 组合 从n个数中取出来0-k个
def fun(nums,k):
    n=len(nums)
    ans=[]
    for i in range(1<<n):
        path=[]
        cnt=0
        for j in range(n):
            if (i>>j)&1 : #判断第j位是1,则符合
                path.append(nums[j])
                cnt+=1
            if cnt>k: #提前剪枝
                break
        if cnt <= k:ans.append(path[:])            
    print(len(ans),ans)
    
fun(nums,2)

结果:

11 [[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], ['b', 'c'], ['d'], ['a', 'd'], ['b', 'd'], ['c', 'd']]

猜你喜欢

转载自blog.csdn.net/F13122298/article/details/130097545