How can I convert a negative integer to a binary string, in other words, how can I find Two's Complement in MATLAB?
You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Show older comments
DEC2BIN converts non-negative decimal integers to a binary string. I want to create binary strings, with a leading sign bit, from any (negative or positive) integer.
Accepted Answer
This can be accomplished using the TYPECAST function. For example, to find a binary string for 'n' with respect to 8-bit two's complement, you can use the command,
dec2bin(typecast(int8(n),'uint8'))
6 Comments
dec2bin(typecast(10.2,'uint64'))
You are incorrect. The binary equivalent of 10.2 involves an infinite repeating decimal, the same way that the decimal representation of 1/7 involves an infinite repeating decimal.
There is no one representation in binary for negative values or for fractions. There are several competing standards for faking it. One of the standards is known as IEEE 754 Double Precision. It is that standard which MATLAB uses to represent numbers in binary. dec2bin(typecast(10.2,'uint64'),64) gives you the string representation of the binary used for 10.2
As to how to get back to the 10.2... with difficulty. Which is why people do not use this method.
Actually checking again I find it doesn't quite work. Instead you need
x = -10.2;
z2 = reshape(dec2bin(typecast(x,'uint8'),8).',1,[])
and you recover with
typecast(uint8(bin2dec(reshape(z2,8,[]).')),'double')
If you want to get back exactly what you started with, you need to use this (or equivalent.) Or, alternately, you could define your own format with precision sufficient for your needs. Be sure to take into account how you represent negatives and how you represent a potentially large range of values.
If x is a matrix then the conversion to binary is the same, but after the code for converting back you need to reshape() to appropriate size.
reshape() it to vector.
You cannot get back the correct number if you convert -5.82 to fewer bits.
value = -5.82;
bits32 = dec2bin(typecast(single(value),'uint32'))
retrieved = typecast(uint32(bin2dec(bits32)),'single');
value - retrieved
ans =
single
1.716614e-07
The best retrieved value you can get differs from the original by about 3 parts per billion.
Sure there are other ways to generate 32 bit representations of double precision numbers, but think about this for a moment:
There are at most 2^32 different 32 bit numbers.
In double precision, for any given floating point mantissa, there are 52 bits of fraction, so thare are at least 2^52 different double precision numbers. For example 1 + (0:2^52-1)/2^53 constructs 2^52 different double precision floating point numbers with the same mantissa:
>> num2hex(1)
ans =
'3ff0000000000000'
>> num2hex(2-eps)
ans =
'3fffffffffffffff'
>> log2(eps)
ans =
-52
By the Pigeon Hole principle, it is obvious that you cannot come even close to representing all possible double precision numbers in 32 bits. No matter what encoding you use for the 32 bits, there are at most 2^32 different states, and that is not enough to encode 2^52 different values.
More Answers (0)
Categories
Find more on Data Type Conversion in Help Center and File Exchange
Products
See Also
on 26 Jun 2013
on 2 Oct 2020
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)