Mathematica Asked by zchenkui on December 23, 2020
I have a question about the binary of negative integer number in Mathematica.
In most implementations, negative signed integers are stored in what is called two’s complement. The other major way of storing negative signed numbers is called one’s complement.
The two’s complement of an N-bit number x is defined as 2^N – x. For example, the two’s complement of 8-bit 1 is 2^8 – 1, or 1111 1111. The two’s complement of 8-bit 8 is 2^8 – 8, which in binary is 1111 1000. This can also be calculated by flipping the bits of x and adding one. For example:
1 = 0000 0001
~1 = 1111 1110
-1 = ~1 + 1 = 1111 1111
21 = 0001 0101
~21 = 1110 1010
-21 = 1110 1011
128 = 1000 0000
~128 = 0111 1111
-128 = 1000 0000
They can also be calculated as:
-1 = 2^8 - 1 = 255 = 1111 1111
-21 = 2^8 - 21 = 234 = 1110 1010
-128 = 2^8 - 128 = 128 = 1000 0000
These results are exactly identical to the results calculated in C language. However, when using Mathematica (I use Mathematica 11.1.0), the results are quite different:
BaseForm[-1, 2] = -1
BaseForm[-21, 2] = -10101
BaseForm[-128, 2] = -1000 0000
My question is: How to get the right results using Mathematica? Am I use the WRONG command?
Thanks a lot!
I am not expert and I am mostly posting this for future me but here is how I implement 2's complement in Mathematica
twosComplement[x_, n_] :=
UnitBox@IntegerDigits[x, 2, n] // FromDigits[#, 2] & //
Plus[#, 1] & // IntegerDigits[#, 2] & // PadLeft[#, n] &
I've seen other places on this site that claim to show 2's complement (can't seem to find them now) but they are actually calculating 1's complement. Or if they calculate using the definition correctly, the MSB bits are not 1's like they should be. This accounts for that. Also retains the array length when the complement has only 0's in its prefix.
Answered by skyfire on December 23, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP