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