当前位置:首页 >> 编程语言 >> 【Python位运算】——左移操作(<<)右移操作>>,vx555hd

【Python位运算】——左移操作(<<)右移操作>>,vx555hd

0evadmin 编程语言 1
文件名:【Python位运算】——左移操作(<<)右移操作>>,vx555hd 【Python位运算】——左移操作(<<)右移操作>>

目录

左移操作

右移操作

其他博主的理解

应用——力扣题目78. 子集

解法

深度优先搜索

位运算

参考文献


左移操作

# 左移操作,左移一位相当于乘以b,a<<b,a' = a*(2^b)

print(2<<3) # 2*2^3 = 16,2的二进制10,向左移动3位后10000print(2<<1) # 2*2^1 = 4print(3<<4) # 3*2^4 = 48,3的二进制为11,向左移动四位后110000

16 4 48

右移操作

# 右移操作,右移一位相当于除以b,a<<b,a' = a//(2^b)注意这里是整除,当向右移动位数大于能移动的位数时,置为0【可以理解为会将尾巴截掉】  

print(2>>3) # 2//2^3 = 0,2的二进制10,向右最多移动2位后,所以多移动无疑为0print(2>>1) # 2*2^1 = 4,向右移动一位为01,print(3>>4) # 3*2^4 = 48,3的二进制为11,向右移动四位后00print(3>>1) # 3*2^4 = 48,3的二进制为11,向右移动一位后为01

0 1 0 1

其他博主的理解

 >> 和 <<都是位运算,对二进制数进行移位操作。 << 是左移,末位补0,类比十进制数在末尾添0相当于原数乘以10,x<<1是将x的二进制表示左移一位,相当于原数x乘2。比如整数4在二进制下是100,4<<1左移1位变成1000(二进制),结果是8。 >>是右移,右移1位相当于除以2。 而>>=和<<=,就是对变量进行位运算移位之后的结果再赋值给原来的变量,可以类比赋值运算符+=和-=可以理解。 比如x>>=2, 就是把变量x右移2位,再保留x操作后的值。

应用——力扣题目78. 子集

78. 子集——力扣题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0] 输出:[[],[0]]

提示:

    1 <= nums.length <= 10     -10 <= nums[i] <= 10     nums 中的所有元素 互不相同

解法

https://leetcode-cn.com/problems/subsets/solution/hui-su-python-dai-ma-by-liweiwei1419/

深度优先搜索

class Solution:# 深度优先搜索# 执行用时:36 ms, 在所有 Python3 提交中击败了85.39% 的用户def subsets(self, nums):res = []sub = []n = len(nums)def dfs(index,sub):if index == n:res.append(sub[:])return# 不选择indexdfs(index+1,sub)# 选择sub.append(nums[index])dfs(index+1,sub)sub.remove(nums[index])dfs(0,sub)return res 位运算

记原序列中元素的总数为 nnn。原序列中的每个数字 aia_iai​ 的状态可能有两种,即「在子集中」和「不在子集中」。我们用 111 表示「在子集中」,000 表示不在子集中,那么每一个子集可以对应一个长度为 nnn 的 0/10/10/1 序列,第 iii 位表示 aia_iai​ 是否在子集中。

例如,n=3,a={1,2,3}:

可以发现 0/1 序列对应的二进制数正好从 0 到2^(n - 1)。我们可以枚举 mask∈[0,2^(n−1)],mask的二进制表示是一个 0/1 序列,我们可以按照这个 0/1 序列在原集合当中取数。当我们枚举完所有 2n2^n2n 个 mask\textit{mask}mask,我们也就能构造出所有的子集。

 这里其实有规律,首先是如果一个集合是由n个无重复数字组成的,那么他的子集个数为2^n,因此我们可以通过两次遍历,一个用于遍历子集数,一个用于遍历每个子集代表的二进制

class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:size = len(nums)n = 1 << sizeres = []for i in range(n):cur = []for j in range(size):if i >> j & 1:cur.append(nums[j])res.append(cur)return res 参考文献

https://zhidao.baidu.com/question/310628609.html

https://www.zhihu.com/question/397471252

协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接