3

I have some code that I wrote up that will successfully return me a binary number. For example, running the code below with an input of 101 will return 5. However, the problem arises when I add 0 bits to the left of MSB, thus not changing the value. When I input 0101 into the system, I should expect 5 to be returned again, but it returns 17 instead.

Here is my code:

int dec1 = 0, rem1=0, num1, base1 = 1;

int a = 101;
while (a > 0){

    rem1 = a % 10;
    dec1 = dec1 + (rem1 * base1);
    base1 = base1 * 2;
    a = a / 10;
}
cout << dec1 << endl;

The output of this is 5. Correct.

However, when 'a' is changed to 0101, the output becomes 17. I believe my error has to do with a misunderstanding of the modulo operator.

101%10 = 1 right? Does the compiler typically read 0101%10 the same way?

I added a cout statement to my code to see what value is stored in rem1 after the value of 0101%10 is calculated.

int dec1 = 0, rem1=0, num1, base1 = 1;

int a = 101;
while (a > 0){

    rem1 = a % 10;
    cout << rem1 << endl;
    dec1 = dec1 + (rem1 * base1);
    base1 = base1 * 2;
    a = a / 10;
}
cout << dec1 << endl;

From this, I was able to see that right after 0101%10 is calculated, a value of 5 is stored in rem1, instead of 1.

Does adding this 0 in front of the MSB tell the compiler "hey, this number is in binary?" because if the compiler is reading 5%10 instead of 0101%10, then I guess the error makes sense.

Upon testing my theory, I changed 'a' to 1000 and the output was 8, which is correct.

Changing 'a' to 01000 gives a result of 24. rem1= 01000%10 should be 0, however rem1 is storing 2. 01000 binary = 8 decimal. 8%10=8? not 2?

I'm an unsure of what is going on and any help is appreciated!

2
  • 2
    I think that the way you are storing your binary number is incorrect. You should use a binary string instead. You may ask why do that? Well, because you can reach the limits of an integer pretty fast if you store the 1s and 0s as you do. Right now your int a stores the 101 as a decimal that is "one hundred and one". Commented Apr 20, 2017 at 4:20
  • Why not do this using bit shift operators? If you want me to post a solution, I can, but this sounds like a homework problem and I don't want to give away the solution. Commented Apr 20, 2017 at 4:27

2 Answers 2

4

101 is parsed as a decimal (base 10) number, so you get your expected output.

0101 is parsed as an octal (base 8) number due to the leading zero. The leading zero here works just like the leading 0x prefix that denotes a hexadecimal (base 16) number, except that without the x it's base 8 instead of base 16.

1018 = 82 + 80 = 64 + 1 = 65

65 % 10 = 5

65 / 10 = 6

6 % 10 = 7

5 * 2 + 7 = 17

If I were you, I'd add an assert(rem1 == 0 || rem1 == 1) inside your loop right after your assignment to rem1 as a sanity check. If you ever get a remainder larger than one or less than zero then there's obviously something wrong.

As rbaleksandar points out in his comment above, the easiest way to avoid this issue is probably to store your input as a c-string (char[]) rather than using an integer literal. This is also nice because you can just iterate over the characters to compute the value instead of doing % and / operations.

Alternatively, you could use hex literals (e.g., 0x101 or 0x0101) for all of your inputs, and change your math to use base 16 instead of base 10. This has the added advantage that base 10 division and remainder functions can be optimized by the compiler into much cheaper bit-shift and bit-mask operations since 16 is a power of 2. (E.g., 0x101 % 16 ==> 0x101 & 15, and 0x101 / 16 ==> 0x101 >> 4).


For more info see http://en.cppreference.com/w/cpp/language/integer_literal

Sign up to request clarification or add additional context in comments.

Comments

0

0101 is Octal number, which value is 17.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.