12,064,855 members (38,408 online)

Email

Password

Sign in using

I have small favor to ask.Anybody know the formula to convert binary coded decimal to Bin as well as hex.Kind regards.

Comments

How about (C#):

[EDIT]

You may try to optimize as follows:

1)

2)

3)

Since right shift is arithmetic shift, and since the shifted 4 bits need to be isolated from the rest, we must mask the results of the right shift to the respective 4 bits in the bit pattern:

4)

Similarily, v *= 100 can be optimized:

1)

Putting all together:

Cheers

Andi

```
int i = 0x12345678; // assuming: BCD encoded
int v = 0;
foreach (byte b in BitConverter.GetBytes(i).Reverse())
{
int r = (b & 0x0F) + 10 * ((b >> 4) & 0x0F);
v *= 100;
v += r;
Console.WriteLine("0x{0:X2} -> {1} = 0x{1:X2}", b, r);
}
Console.WriteLine("0x{0:X8} -> {1} = 0x{1:X8}", i, v);
```

This results in:```
0x12 -> 12 = 0x0C
0x34 -> 34 = 0x22
0x56 -> 56 = 0x38
0x78 -> 78 = 0x4E
0x12345678 -> 12345678 = 0x00BC614E
```

Not speed optimized, though.[EDIT]

You may try to optimize as follows:

1)

`10 * x = (8 + 2) * x = (x << 3) + (x << 1)`

2)

`10 * (b >> 4) = ((b >> 4) << 3) + ((b >> 4) << 1)`

3)

`10 * (b >> 4) = (b >> 1) + (b >> 3)`

Since right shift is arithmetic shift, and since the shifted 4 bits need to be isolated from the rest, we must mask the results of the right shift to the respective 4 bits in the bit pattern:

4)

`10 * (b >> 4) = ((b >> 1) & 0x78) + ((b >> 3) & 0x1E)`

Similarily, v *= 100 can be optimized:

1)

`v *= 100 --> v *= (64 + 32 + 4) --> v = (v << 6) + (v << 5) + (v << 2)`

Putting all together:

```
int i = 0x12345678;
int v = 0;
foreach(byte b in BitConverter.GetBytes(i).Reverse())
{
v = (v << 6) + (v << 5) + (v << 2); // next byte: multiply by 100
v += (b & 0x0F) + ((b >> 1) & 0x78) + ((b >> 3) & 0x1E); // 0xUV = 0x0V + 10 * (0xU0 / 16) = 0x0V + 1/2*0xU0 + 1/8*0xU0
}
Console.WriteLine("0x{0:X8} -> {1} = 0x{1:X8}", i, v);
```

[/EDIT]Cheers

Andi

v7

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

CodeProject,
503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada
+1 416-849-8900 x 100

If you want to answer to solution #1, use [have a question or comment] button.

Andi