簡體   English   中英

無法理解 random.sample(range(1,40),3)) 和 sum(1<<div id="text_translate"><p> 我正在嘗試調試這段代碼並學習一些東西。 我了解到它為i生成了 3 個唯一值,但是sum的值怎么會變得這么大呢?</p><p> 如果我運行它並調試它,它會像這樣。 它保持變化,因為值是隨機選擇的。</p><p> i = 6 i = 26 i = 38</p><p> test_num = 274945015872</p><p> <strong>Output:</strong> 100000000000100000000000000000001000000</p><p> 為什么 test_num 的值為test_num 274945015872 ? 然后它使用此值生成39-bit二進制字符串。 怎么樣?</p><p> 有人可以解釋嗎?</p><p> <strong>這是代碼:</strong></p><pre> test_num = sum(1<<i for i in random.sample(range(1,40),3)) #left to right one bit shifting print (print (f"{test_num:039b}"))</pre></div>

[英]Not able to understand random.sample(range(1,40),3)) with sum(1<<i for i in random.sample(range(1,40),3))

我正在嘗試調試這段代碼並學習一些東西。 我了解到它為i生成了 3 個唯一值,但是sum的值怎么會變得這么大呢?

如果我運行它並調試它,它會像這樣。 它保持變化,因為值是隨機選擇的。

i = 6 i = 26 i = 38

test_num = 274945015872

Output: 100000000000100000000000000000001000000

為什么 test_num 的值為test_num 274945015872 然后它使用此值生成39-bit二進制字符串。 怎么樣?

有人可以解釋嗎?

這是代碼:

test_num = sum(1<<i for i in random.sample(range(1,40),3))
#left to right one bit shifting
print (print (f"{test_num:039b}"))

這就是加法的工作原理......

  0b1000           8
+ 0b0100         + 4
---------       -----
  0b1100           12

每個1<<N創建一個 integer,它的二進制值恰好是 1 '1' 和 rest 零

如果您的索引恰好是 [0,1,2],則將它們相加會設置所有一位(integer,其中 3 個不同的位設置為“1”),您最終會得到最小的可能值0b111 (7),但有 40總計 position 0..39 所以很難得到 [0,1,2] 作為你的 output

正如評論中指出的那樣, sum可以替換為

reduce(lambda x,y: x|y ,[i for i in ...])

這是可行的,因為當您保證不同的位置時,NUMERIC ADDITION 和 BITWISE OR 是相同的操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM