【Python位运算】——左移操作(<<)右移操作>>
目錄
左移操作
右移操作
其他博主的理解
應(yīng)用——力扣題目78. 子集
解法
深度優(yōu)先搜索
位運算
參考文獻
左移操作
# 左移操作,左移一位相當(dāng)于乘以b,a<<b,a' = a*(2^b)
16
4
48
右移操作
# 右移操作,右移一位相當(dāng)于除以b,a<<b,a' = a//(2^b)注意這里是整除,當(dāng)向右移動位數(shù)大于能移動的位數(shù)時,置為0【可以理解為會將尾巴截掉】
?
0
1
0
1
其他博主的理解
?>> 和 <<都是位運算,對二進制數(shù)進行移位操作。
<< 是左移,末位補0,類比十進制數(shù)在末尾添0相當(dāng)于原數(shù)乘以10,x<<1是將x的二進制表示左移一位,相當(dāng)于原數(shù)x乘2。比如整數(shù)4在二進制下是100,4<<1左移1位變成1000(二進制),結(jié)果是8。
>>是右移,右移1位相當(dāng)于除以2。
而>>=和<<=,就是對變量進行位運算移位之后的結(jié)果再賦值給原來的變量,可以類比賦值運算符+=和-=可以理解。
比如x>>=2, 就是把變量x右移2位,再保留x操作后的值。
應(yīng)用——力扣題目78. 子集
78. 子集——力扣題目
給你一個整數(shù)數(shù)組 nums ,數(shù)組中的元素 互不相同 。返回該數(shù)組所有可能的子集(冪集)。
解集 不能 包含重復(fù)的子集。你可以按 任意順序 返回解集。
示例 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/
深度優(yōu)先搜索
class Solution:# 深度優(yōu)先搜索# 執(zhí)行用時: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位運算
記原序列中元素的總數(shù)為 nnn。原序列中的每個數(shù)字 aia_iai? 的狀態(tài)可能有兩種,即「在子集中」和「不在子集中」。我們用 111 表示「在子集中」,000 表示不在子集中,那么每一個子集可以對應(yīng)一個長度為 nnn 的 0/10/10/1 序列,第 iii 位表示 aia_iai? 是否在子集中。
例如,n=3,a={1,2,3}:
可以發(fā)現(xiàn) 0/1 序列對應(yīng)的二進制數(shù)正好從 0 到2^(n - 1)。我們可以枚舉 mask∈[0,2^(n?1)],mask的二進制表示是一個 0/1 序列,我們可以按照這個 0/1 序列在原集合當(dāng)中取數(shù)。當(dāng)我們枚舉完所有 2n2^n2n 個 mask\textit{mask}mask,我們也就能構(gòu)造出所有的子集。
?這里其實有規(guī)律,首先是如果一個集合是由n個無重復(fù)數(shù)字組成的,那么他的子集個數(shù)為2^n,因此我們可以通過兩次遍歷,一個用于遍歷子集數(shù),一個用于遍歷每個子集代表的二進制
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
總結(jié)
以上是生活随笔為你收集整理的【Python位运算】——左移操作(<<)右移操作>>的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ubuntu setting]Chan
- 下一篇: div+css实现背景透明