Click here to Skip to main content
Sign Up to vote bad
good
See more: digitallogic
I have small favor to ask.Anybody know the formula to convert binary coded decimal to Bin as well as hex.Kind regards.
Posted 17 Feb '13 - 23:41

Comments
Andreas Gieriet - 18 Feb '13 - 15:42
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

3 solutions

  Permalink  
How about (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:
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
  Permalink  
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.
  Permalink  

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

  Print Answers RSS
Your Filters
Interested
Ignored
     
0 OriginalGriff 253
1 Rohan Leuva 220
2 Sergey Alexandrovich Kryukov 208
3 Abhinav S 168
4 Mahesh Bailwal 165
0 Sergey Alexandrovich Kryukov 8,494
1 OriginalGriff 6,799
2 CPallini 3,603
3 Rohan Leuva 2,923
4 Maciej Los 2,234


Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 18 Feb 2013
Copyright © CodeProject, 1999-2013
All Rights Reserved. Terms of Use
Layout: fixed | fluid