## Fastest method to convert unsigned int to byte array

**Moderator:** Moderators

### Fastest method to convert unsigned int to byte array

For my new game, I need a way to convert a two-byte unsigned integer value into an array of byte values where each array item represents one decimal digit.

So, if this is my variable:

static uint number = 24680;

then the converted array (byte numberArray[5]) shall have these values:

numberArray[0] == 2

numberArray[1] == 4

numberArray[2] == 6

numberArray[3] == 8

numberArray[4] == 0

If it's faster and easier to calculate, this would also work:

numberArray[0] == 0

numberArray[1] == 8

numberArray[2] == 6

numberArray[3] == 4

numberArray[4] == 2

Which is the fastest way to do this in Assembly? Is there any established best method for it?

So, if this is my variable:

static uint number = 24680;

then the converted array (byte numberArray[5]) shall have these values:

numberArray[0] == 2

numberArray[1] == 4

numberArray[2] == 6

numberArray[3] == 8

numberArray[4] == 0

If it's faster and easier to calculate, this would also work:

numberArray[0] == 0

numberArray[1] == 8

numberArray[2] == 6

numberArray[3] == 4

numberArray[4] == 2

Which is the fastest way to do this in Assembly? Is there any established best method for it?

Available now: My game "City Trouble".

Sales website: https://megacatstudios.com/products/city-trouble

Gameplay: https://youtu.be/Eee0yurkIW4

Download website: http://www.denny-r-walter.de/city.htm

Sales website: https://megacatstudios.com/products/city-trouble

Gameplay: https://youtu.be/Eee0yurkIW4

Download website: http://www.denny-r-walter.de/city.htm

### Re: Fastest method to convert unsigned int to byte array

Isn't this just the same old binary to decimal problem that was discussed to death recently and so many times in the past?

- rainwarrior
**Posts:**7716**Joined:**Sun Jan 22, 2012 12:03 pm**Location:**Canada-
**Contact:**

### Re: Fastest method to convert unsigned int to byte array

If you want to find previous conversations on this topic, this is usually referred to as a conversion to decimal. You might search for "decimal" or for threads about division by 10 / divide by 10 which are almost always the same underlying topic.

The "fastest" way to do this is usually to store the number in decimal form to begin with so you don't have to convert, doing operations on it in decimal as needed.

The "fastest" way to do this is usually to store the number in decimal form to begin with so you don't have to convert, doing operations on it in decimal as needed.

### Re: Fastest method to convert unsigned int to byte array

Well, that's exactly the thing: There are a bazillion threads with several functions per thread.tokumaru wrote:Isn't this just the same old binary to decimal problem that was discussed to death recently and so many times in the past?

So, should people who look for an efficient algorithm search through all those threads, trying out each and every attempt manually?

If this topic has been discussed to death, isn't there a final solution? A definite function that does the conversion in the best way possible?

This might be the fastest way for output. But if you have an energy value that can be decreased by an attack value minus a base defense value minus a temporary status defense value, then is it really the best way to store all these values in five byte long arrays and calculate byte by byte in decimal mode?rainwarrior wrote:The "fastest" way to do this is usually to store the number in decimal form to begin with so you don't have to convert, doing operations on it in decimal as needed.

Available now: My game "City Trouble".

Sales website: https://megacatstudios.com/products/city-trouble

Gameplay: https://youtu.be/Eee0yurkIW4

Download website: http://www.denny-r-walter.de/city.htm

Sales website: https://megacatstudios.com/products/city-trouble

Gameplay: https://youtu.be/Eee0yurkIW4

Download website: http://www.denny-r-walter.de/city.htm

- rainwarrior
**Posts:**7716**Joined:**Sun Jan 22, 2012 12:03 pm**Location:**Canada-
**Contact:**

### Re: Fastest method to convert unsigned int to byte array

No. Like with most things there are many ways to approach the problem, and every situation has different needs.DRW wrote:If this topic has been discussed to death, isn't there a final solution? A definite function that does the conversion in the best way possible?

Here's a solution tepples put on the wiki though, along with links to a few others:

http://wiki.nesdev.com/w/index.php/16-bit_BCD

Sometimes yes, sometimes no.DRW wrote:This might be the fastest way for output. But if you have an energy value that can be decreased by an attack value minus a base defense value minus a temporary status defense value, then is it really the best way to store all these values in five byte long arrays and calculate byte by byte in decimal mode?

*It depends on your specific situation.*I can't answer that question for you, you're the one that knows how often you're going to need to convert, but here you asked for the fastest

*converter*rather than the fastest

*attack calculation*.

### Re: Fastest method to convert unsigned int to byte array

Thanks for your help.

The HexToDec999 code by Omegamatrix is the one that fits my needs best.

This one should really be put into the wiki.

(But it should be cleaned up. For some reason, there are a few compiler errors, like when he forgets to add a : after a label name. I'm not sure how such an error could ever happen.)

The HexToDec999 code by Omegamatrix is the one that fits my needs best.

This one should really be put into the wiki.

(But it should be cleaned up. For some reason, there are a few compiler errors, like when he forgets to add a : after a label name. I'm not sure how such an error could ever happen.)

Available now: My game "City Trouble".

Sales website: https://megacatstudios.com/products/city-trouble

Gameplay: https://youtu.be/Eee0yurkIW4

Download website: http://www.denny-r-walter.de/city.htm

Sales website: https://megacatstudios.com/products/city-trouble

Gameplay: https://youtu.be/Eee0yurkIW4

Download website: http://www.denny-r-walter.de/city.htm

### Re: Fastest method to convert unsigned int to byte array

Not all assemblers require labels to be followed by colons.

### Re: Fastest method to convert unsigned int to byte array

Maybe I just suck at ASM programming, but in my experience this is also a shortcut to terrible hard-to-discover bugs in the way you calculate values. The NES CPU really isn't geared for decimal calculations.rainwarrior wrote: The "fastest" way to do this is usually to store the number in decimal form to begin with so you don't have to convert, doing operations on it in decimal as needed.

If you only ever add/subtract by one you should be fine though.

But I'd absolutely recommend storing your value in a 16 bit space and using tepples 16-bit BCD every time you need to update your visual output.

### Re: Fastest method to convert unsigned int to byte array

I personally prefer to keep numbers that are not used in complex calculations in decimal to begin with. Things like scores, number of coins, and other stuff that only goes through simple addition and subtraction.

Doing calculations on decimal digits is exactly the same as working with multi-byte binary numbers, except you have to manually handle the carry and wrapping around. If you write a couple of macros to do it, you don't have to think about this ever again.

Well, it wasn't designed for running SMB3 either, but people made it do that anyway.Sumez wrote:The NES CPU really isn't geared for decimal calculations.

Doing calculations on decimal digits is exactly the same as working with multi-byte binary numbers, except you have to manually handle the carry and wrapping around. If you write a couple of macros to do it, you don't have to think about this ever again.

### Re: Fastest method to convert unsigned int to byte array

tepples' version is slower than the one by Omegamatrix. Especially in situations where your values only need to go to 999. That's the one I'm using now.Sumez wrote:But I'd absolutely recommend storing your value in a 16 bit space and using tepples 16-bit BCD every time you need to update your visual output.

Although I had to change it a bit.

For example, he stored the high byte of the integer value in A and the low byte in X.

But passing an integer as a parameter to a function from C, A is the low byte and X the high byte.

Even without C, this is a general inconsistency:

His HexToDec99 and HexToDec255 functions expect their single byte value to be in A.

But HexToDec999 and HexToDec65535 expect the high byte in A and the low byte in X, even though a single byte value is basically the equivalent to the low byte value of an integer, so it's only logical that an integer stored in A and X has the low byte in A and the high byte in X.

Sales website: https://megacatstudios.com/products/city-trouble

Gameplay: https://youtu.be/Eee0yurkIW4

Download website: http://www.denny-r-walter.de/city.htm

- rainwarrior
**Posts:**7716**Joined:**Sun Jan 22, 2012 12:03 pm**Location:**Canada-
**Contact:**

### Re: Fastest method to convert unsigned int to byte array

Well, "fast" and "simple" or "safe" are often in opposition. ;PSumez wrote:Maybe I just suck at ASM programming, but in my experience this is also a shortcut to terrible hard-to-discover bugs in the way you calculate values. The NES CPU really isn't geared for decimal calculations.rainwarrior wrote: The "fastest" way to do this is usually to store the number in decimal form to begin with so you don't have to convert, doing operations on it in decimal as needed.

Though TBH it doesn't really seem much worse than a regular multi-byte add.

For Lizard I wrote some routines for this (1, 2), but I don't think it's a very good example. I didn't need it to be fast, or even simple, it just needed to work, and it did.

### Re: Fastest method to convert unsigned int to byte array

Precisely. My own assembler requires labels to be prefixed with an asterisk (*) for example.tokumaru wrote:Not all assemblers require labels to be followed by colons.

Code: Select all

```
*main_init
(code)
*main_loop
(code)
```