开发者

C++ removing leading zeros in a binary array

I am making a program that adds two binary numb开发者_开发问答ers (up to 31 digits) together and outputs the sum in binary.

I have every thing working great but I need to remove the leading zeros off the solution.

This is what my output is:

char c[32];
int carry = 0;
if(carry == '1')
{
    cout << carry;
}

for(i = 0; i < 32; i++)
{
    cout << c[i]; 
}

I tried this but it didn't work:

char c[32];
int carry = 0;
bool flag = false;

if(carry == '1')
{
    cout << carry;
}

for(i=0; i<32; i++)
{
    if(c[i] != 0)
    {
        flag = true;

        if(flag)
        {
            for(i = 0; i < 32; i++)
            {
                cout << c[i]; 
            }
        }
    }
}

Any ideas or suggestions would be appreciated.

EDIT: Thank you everyone for your input, I got it to work!


You should not have that inner loop (inside if(flag)). It interferes with the i processing of the outer loop.

All you want to do at that point is to output the character if the flag is set.

And on top of that, the printing of the bits should be outside the detection of the first bit.

The following pseudo-code shows how I'd approach this:

set printing to false
if carry is 1:
    output '1:'

for each bit position i:
    if c[i] is 1:
        set printing to true
    if printing:
        output c[i]

if not printing:
    output 0

The first block of code may need to be changed to accurately output the number with carry. For example, if you ended up with the value 2 and a carry, you would want either of:

1:10                              (or some other separator)
100000000000000000000000000000010 (33 digits)

Simply outputting 110 with no indication that the leftmost bit was a carry could either be:

  • 2 with carry; or
  • 6 without carry

The last block ensures you have some output for the value 0 which would otherwise print nothing since there were no 1 bits.

I'll leave it up to you whether you should output a separator between carry and value (and leave that line commented out) or use carry to force printing to true initially. The two options would be respectively:

if carry is 1:
    output '1 '

and:

if carry is 1:
    output 1
    set printing to true

And, since you've done the conversion to C++ in a comment, that should be okay. You state that it doesn't work, but I typed in your code and it worked fine, outputting 10:

#include <iostream>

int main(void)
{
    int i;
    int carry = 0;
    int c[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0};
    bool print = false;

    // This is the code you gave in the comment, slightly modified.
    // vvvvvv
    if(carry == 1) {
        std::cout << carry << ":";
    }

    for (i = 0; i < 32; i++) {
        if (c[i] == 1) {
            print = true;
        }

        if (print) {
            std::cout << c[i];
        }
    }
    // ^^^^^^

    std::cout << std::endl;

    return 0;
}


const char * begin = std::find(c, c+32, '1');
size_t len = c - begin + 32;
std::cout.write(begin, len);


Use two fors over the same index. The first for iterates while == 0, the second one prints starting from where the first one left off.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜