How about (C#):
int i = 0x12345678;
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);
v += (b & 0x0F) + ((b >> 1) & 0x78) + ((b >> 3) & 0x1E);
}
Console.WriteLine("0x{0:X8} -> {1} = 0x{1:X8}", i, v);
[/EDIT]
Cheers
Andi