Daniel
Daniel

Reputation: 49

Hex to Dec using bit-manipulation

Could somebody explain how this actually works for example the char input = 'a'. I understand that << shift the bits over by four places (for more than one character). But why in the second part add 9? I know 0xf = 15.....Am I missing something obvious.

result = result << 4 | *str + 9 & 0xf;

Here is my understand so far:

char input = 'a' ascii value is 97. Add 9 is 106, 106 in binary is 01101010. 0xf = 15 (00001111), therefore 01101010 & 00001111 = 00001010, this gives the value of 10 and the result is then appended on to result.

Thanks in advance.

Upvotes: 0

Views: 1463

Answers (1)

dbush
dbush

Reputation: 224062

First, let's rewrite this with parenthesis to make the order of operations more clear:

result = (result << 4) | ((*str + 9) & 0xf);

If result is 0 on input, then we have:

result = (0 << 4) | ((*str + 9) & 0xf);

Which simplifies to:

result = (0) | ((*str + 9) & 0xf);

And again to:

result = (*str + 9) & 0xf;

Now let's look at the hex and binary representations of a - f:

a = 0x61 = 01100001
b = 0x62 = 01100010
c = 0x63 = 01100011
d = 0x64 = 01100100
e = 0x65 = 01100101
f = 0x66 = 01100110

After adding 9, the & 0xf operation clears out the top 4 bits, so we don't need to worry about those. So we're effectively just adding 9 to the lower 4 bits. In the case of a, the lower 4 bits are 1, so adding 9 gives you 10, and similarly for the others.

As chux mentioned in his comment, a more straightforward way of achieving this is as follows:

result = *str - 'a' + 10;

Upvotes: 1

Related Questions