二进制遍历 python

文章介绍了二进制的按位与运算规则,以及左位运算和右位运算的概念。通过示例展示了如何使用位运算进行左移和右移操作。此外,还提供了计算全排列和组合的函数实现,分别用于从给定数组中生成所有可能的子集排列和指定数量的组合。
摘要由CSDN通过智能技术生成
二进制的运算

按位与运算 &
运算规则: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']]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值