0

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}"))
Barmar
  • 741,623
  • 53
  • 500
  • 612
  • Just to note, you can use `random.seed` to share a persistent result. – S.B Oct 09 '22 at 22:18
  • If the values of `i` were 6, 26, and 38, the result is a number with the 6th, 26th, and 38th bits set (counting from the right). – jasonharper Oct 09 '22 at 22:19

1 Answers1

1

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

Joran Beasley
  • 110,522
  • 12
  • 160
  • 179