Click here to Skip to main content
15,881,882 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more: (untagged)
I have small favor to ask.Anybody know the formula to convert binary coded decimal to Bin as well as hex.Kind regards.
Posted
Comments
Andreas Gieriet 18-Feb-13 15:42pm    
Please remove your solution #2 - this is not a solution.
If you want to answer to solution #1, use [have a question or comment] button.
Andi

 
Share this answer
 
How about (C#):
C#
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:
C#
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
 
Share this answer
 
v7
Thanks a lot. Now I get it to convert Bcd to hex u just replace each with its Bin equivalent then convert that to hex. Much appreciated. Helpful.
 
Share this answer
 

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



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900