二进制的运算
按位与运算 &
运算规则: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']]