Blazing Code
Blazing Code

Reputation: 25

Binary to decimal algorithm in c giving strange results

Hi i'm fairly new to c but for a program I'm writing I need to convert binary strings to decimal numbers. here is my current code:

int BinaryToInt(char *binaryString)
{
    int decimal = 0;
    int len = strlen(binaryString);
    for(int i = 0; i < len; i++)
    {

        if(binaryString[i] == '1')
            decimal += 2^((len - 1) - i);
        printf("i is %i and dec is %i and the char is %c but the length is %i\n", i, decimal, binaryString[i], len);
    }
    return decimal;
}

int main(int argc, char **argv)
{
    printf("%i", BinaryToInt("10000000"));
}

and here is the output:

i is 0 and dec is 5 and the char is 1 but the length is 8
i is 1 and dec is 5 and the char is 0 but the length is 8
i is 2 and dec is 5 and the char is 0 but the length is 8
i is 3 and dec is 5 and the char is 0 but the length is 8
i is 4 and dec is 5 and the char is 0 but the length is 8
i is 5 and dec is 5 and the char is 0 but the length is 8
i is 6 and dec is 5 and the char is 0 but the length is 8
i is 7 and dec is 5 and the char is 0 but the length is 8
5

I'm confused as to why this doesn't work, all help is greatly appreciated. Thanks in advance!

Ps: I'm used to java so at the moment C just makes me cry

Upvotes: 0

Views: 79

Answers (2)

Weather Vane
Weather Vane

Reputation: 34585

The trick is the same as with any number base: for each incoming digit, multiply the accumulator by the number base and add the digit.

#include <stdio.h>
#include <string.h>

int BinaryToInt(char *binaryString)
{
    int decimal = 0;
    int len = strlen(binaryString);
    for(int i = 0; i < len; i++) {
        decimal = decimal * 2 + binaryString[i] - '0';
    }
    return decimal;
}

int main(void)
{
    printf("%d", BinaryToInt("10000000"));
    return 0;
}

Program output:

128

Upvotes: 2

dbush
dbush

Reputation: 223739

The ^ operator is not for exponentiation, but is instead the bitwise XOR operator.

If you want to raise a number to a power of 2, use the left shift operator << to shift the value 1 by the exponent in question.

decimal += 1 << ((len - 1) - i);

Upvotes: 4

Related Questions