Python Forum
Find the complement of a number - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Find the complement of a number (/thread-1675.html)



Find the complement of a number - landlord1984 - Jan-19-2017

I want to find the complement of a number
For example:

The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.
The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.

From: https://www.tutorialspoint.com/python/bitwise_operators_example.htm
It suggests it just need to use "~". It shows:

a=60

bin(a)=0011 1100 
bin(~a)= 1100 0011=-61
But on my python3.5, what I get is:
a=60
bin(a)=0011 1100 
bin(~a)= 111101=-61
The resulted number -61 is right, but its binary form is not complement of a.

What happened?

Thanks,

L


RE: Find the complement of a number - Aquaplant - Jan-19-2017

Hi there,


it is explained very well here:
http://superuser.com/questions/975684/converting-negative-decimal-to-binary

There is a small difference between the 1's and 2's complement.
The 1's complement simply switches 0->1 and 1->0, like 1010 becomes 0101.
With the 2's complement you proceed the same way, but add 1 in the end: 1010->0101 (1's complement) +0001 -> 0110 (2's complement).

Now you can represent positive numbers. What about negatives? We can assign the first bit to the sign. That means 0 for + and 1 for -:
1111 1111 to 0111 1111 (8 bit := 1 Byte); that is what you can read detailed above.

To answer your question:
60 (dec) -> 0011 1100 (bin)
1's complement: 1100 0011, that means the first 1 -> - and 100 0011 is 67. You work with one Byte (=8bit), 1 is already assigned, so 7 left. 2**7 = 128. You now substract (because this is a negative value and this is how negative values are represented in binary) this value of 67; 67-128 = -61.


With Python 3.5:
>>> bin(~60)
'-0b111101'
>>> format(~60, 'b')
'-111101'
The sign is already stored separately, so you just get the binary form of 60 and the "2's complement" by adding 1: 61.
I have no detailed knowledge how python stores bits, but from its behavior I suggest this result.

Hope my explanation was understandable.


RE: Find the complement of a number - landlord1984 - Jan-20-2017

(Jan-19-2017, 01:42 PM)Aquaplant Wrote: '-0b111101'
Thanks for the information. Now I understand there are varied ways of complement.

But I still don't know how to convert '0011 1100' to '1100 0011' with the built in function have in Python 3.5

Any idea?


RE: Find the complement of a number - wavic - Jan-20-2017

You can implement it.

def bswitch(num):
    c = 1

    while num*2 > c:
        num = num ^ c
        c = c << 1

    return num
Output:
>>> bswitch(10) 5 >>> bin(10) '0b1010' >>> bin(5) '0b101' >>> bswitch(32) 31 >>> bin(32) '0b100000' >>> bin(31) '0b11111' >>>



RE: Find the complement of a number - shreyaspadhye3011 - Feb-21-2020

''.join([str((int(c) ^ 1)) for c in "00111100"])

This should do it