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

Question:

I am trying to debug this piece of code and learn a little. I learn that it generates 3 unique values for i but how come the values of sum become this much big?

If I run it and debug it, it goes something like this. It keep changes since values are chosen randomly.

i = 6
i = 26
i = 38

test_num = 274945015872

Output:
100000000000100000000000000000001000000

Why the value for test_num 274945015872? It then uses this value to generate 39-bit binary string. Like how?

Can someone explain?

Here is the code:

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}"))
Asked By: Oceans

||

Answers:

this is how addition works …

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

each 1<<N creates an integer that has a binary value with exactly 1 ‘1’ and the rest zero

suming them sets all the one bits (a integer with 3 distinct bits set to ‘1’) if your indexes happen to be [0,1,2] you end up with the smallest possible value of 0b111 (7) but there are 40 total position 0..39 so it would be rare to get [0,1,2] as your output

as pointed out in the comments the sum can be replaced with

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

this works because when you have a guarantee of distinct one positions NUMERIC ADDITION and BITWISE OR are identical operations

Answered By: Joran Beasley