[英]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.