C ++删除二进制数组中的前导零

时间:2011-09-16 01:37:49

标签: c++ binary

我正在制作一个程序,将两个二进制数字(最多31个数字)加在一起,并以二进制形式输出总和。

我的每件事情都很好但我需要从解决方案中删除前导零。

这就是我的输出:

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

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

我尝试了这个,但它不起作用:

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]; 
            }
        }
    }
}

任何想法或建议都将受到赞赏。

编辑:谢谢大家的意见,我让它发挥作用!

3 个答案:

答案 0 :(得分:2)

你不应该有那个内循环(在if(flag)内)。它干扰了外循环的i处理。

如果设置了标志,那么你想要做的就是输出字符。

最重要的是,位的打印应该在第一位的检测之外。

以下伪代码显示了我如何处理这个问题:

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

可能需要更改第一个代码块以准确输出带有进位的数字。例如,如果你最终得到值2和一个进位,你会想要:

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

只输出110而没有任何迹象表明最左边的位是进位可能是:

  • 2携带;或
  • 6无携带

最后一个块确保你有一些值0的输出,否则就不会打印,因为没有1位。

我会告诉你是否应该在进位和值之间输出一个分隔符(并将该行注释掉)或者最初使用进位强制printing为true。这两个选项分别是:

if carry is 1:
    output '1 '

if carry is 1:
    output 1
    set printing to true

而且,既然你已经在评论中完成了对C ++的转换,那应该没问题。您声明它不起作用,但我输入了您的代码并且工作正常,输出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;
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在同一索引上使用两个fors。第一个用于迭代,而= = 0,第二个打印从第一个离开的位置开始。