Asked by jip prinsen
on 21 Sep 2017

Hey all, I'm working on a school project that's about changing the order of characters in a binary array. In the process of writing it, I found a bit of code online to help me:

v = sprintf('%d', array3)

endarray = v - '0'

Basically, what this does is it takes the value of array3, which for example is [1011010] and creates a variable endarray, which in turn becomes [1 0 1 1 0 1 0]. When I implemented this piece of code I didn't quite know how it functioned, and it wasn't explained on the page where I found it, so I decided to go back to it later. Unfortunately I still haven't figured it out. I can't wrap my head around the combinations of sprintf, %d, and the -'0'.

Any help with understanding these two lines would be greatly appreciated.

Answer by Pal Szabo
on 21 Sep 2017

Edited by Pal Szabo
on 21 Sep 2017

Accepted Answer

array3 is an integer. Sprintf needs to no that it is in decimal point notation, that's why you need the %d. More info: https://uk.mathworks.com/help/matlab/matlab_prog/formatting-strings.html. Strings in matlab are basically chain of chars. By subtractring -'0', you are basically subtracting 0 (decimal notation) from the ASCII values of the chars within the string. Executing an operation on each char within the chain of chars (aka on the string) gives a result of individual chars, since the operation only valid on individual chars, not on the string as a whole. Try this for example:

array3 = [1011010]

v = sprintf('%d', array3)

endarray = v - '0' - 'd'

You get

-99 -100 -99 -99 -100 -99 -100

You get the same result if define endarray like this:

endarray = v - '0' - 100

Here 100 is an integer, not a chain of chars.

Sub in different values for 'd': the results are consistent with the ASCII table.

Hope this helps.

EDIT: I see you added a tag 'binary'. I do not think array3 is binary, just because it has only ones and zeros, it is pretty much a decimal value. Just like 8+2=10, 10 is not binary.

José-Luis
on 21 Sep 2017

array3 is an integer. Sprintf needs to no that it is in decimal point notation, that's why you need the %d.

How do you figure that?

sprintf('%d',0.5)

Pal Szabo
on 21 Sep 2017

Okay you are right, I may be confusing the meaning of the expressions "decimal point" and "base 10". If I say

array3 is an integer. Sprintf needs to no that it is a number in base 10, that's why you need the %d.

Is this right?

José-Luis
on 21 Sep 2017

Looks like array3 is a scalar and not a logical array.

Sign in to comment.

Answer by José-Luis
on 21 Sep 2017

Edited by José-Luis
on 21 Sep 2017

Generating a "binary" (logical) array:

a = rand(10,1) > 0.5;

Transforming the binary array into a string. v is a character array.

v = sprintf('%d', a)

Transforming the string into a numeric array:

endarray = v - '0'

Matlab does implicit conversions. When you do arithmetic operation with characters, it transforms them into double and then performs the operations.

'0' - 48

Please note that all that is unnecessary if you want an array of doubles from a logical array. You could just have:

endarray = double(a)

Guillaume
on 21 Sep 2017

The starting point is not a logical array but a binary number encoded as a decimal, e.g.

a = 1011010;

Hence the trip through a char array to get the digits of that decimal number.

José-Luis
on 21 Sep 2017

Thanks. I was wrong but in essence sort of right.

Definitely maybe.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 1 Comment

## Pal Szabo (view profile)

Direct link to this comment:https://ch.mathworks.com/matlabcentral/answers/357720-help-with-a-piece-of-code#comment_486470

Sign in to comment.