12 Aug 2022

Posted on:

11 Aug 2022

0

# Understanding a better solution Q19 (num & 1)

hi...so I've attempted this question with what I thought was an elegant solution :)...

``````def don_odd_even(num):
if (num % 2) == 0:
print('Even')
else:
print('Odd')
``````

...but reviewing Giles' solution...

``````def odd_even(num):
if (num & 1):
print('Odd')
else:
print('Even')
``````

... I'd like to understand how the '&' operator achieved the same functionality as the modulus function used in my attempt.

Warm regards,
-don

Instructor
Posted on:

12 Aug 2022

0

Hey Don,

Your solution is indeed great! What Giles makes use of are bitwise operators.

If you execute on a new line the following:

``````42 & 1
``````

you will get 0. If you instead execute the following:

``````43 & 1
``````

you will get 1. Typing any odd number before & will result in 1, while trying any even number before the & will return 0. Since 1 corresponds to `True`, while 0 corresponds to `False`, you will print out `'Odd'` for odd numbers and `'Even'` for even numbers.

Think of the `&` operator as binary multiplication. By applying `&` to `num` and `1`, it is implied that you are multiplying them in binary. In binary, all even numbers end with a 0, while all odd numbers end with a 1. This means that multiplying the former by 1 would return a 0, while multiplying the latter by 1 would return a 1.

You can use the following syntax to convert decimal numbers in binary

``````bin(a)
``````

where `a` is any integer. You will quickly convince yourself that indeed all even numbers end with a 0, while all odd numbers end with a 1.

Hope this helps!

Kind regards,
365 Hristina