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=-61But on my python3.5, what I get is: a=60 bin(a)=0011 1100 bin(~a)= 111101=-61The 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
RE: Find the complement of a number - shreyaspadhye3011 - Feb-21-2020 ''.join([str((int(c) ^ 1)) for c in "00111100"]) This should do it |