日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2023/12/10 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python位运算】——左移操作(<<)右移操作>> 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

左移操作

右移操作

其他博主的理解

應(yīng)用——力扣題目78. 子集

解法

深度優(yōu)先搜索

位運(yùn)算

參考文獻(xiàn)


左移操作


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

print(2<<3) # 2*2^3 = 16,2的二進(jìn)制10,向左移動(dòng)3位后10000 print(2<<1) # 2*2^1 = 4 print(3<<4) # 3*2^4 = 48,3的二進(jìn)制為11,向左移動(dòng)四位后110000

16
4
48

右移操作

# 右移操作,右移一位相當(dāng)于除以b,a<<b,a' = a//(2^b)注意這里是整除,當(dāng)向右移動(dòng)位數(shù)大于能移動(dòng)的位數(shù)時(shí),置為0【可以理解為會(huì)將尾巴截掉】
?

print(2>>3) # 2//2^3 = 0,2的二進(jìn)制10,向右最多移動(dòng)2位后,所以多移動(dòng)無(wú)疑為0 print(2>>1) # 2*2^1 = 4,向右移動(dòng)一位為01, print(3>>4) # 3*2^4 = 48,3的二進(jìn)制為11,向右移動(dòng)四位后00 print(3>>1) # 3*2^4 = 48,3的二進(jìn)制為11,向右移動(dòng)一位后為01

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。