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

C++ removing leading zeros in a binary array

本文关键字:删除 二进制 数组 c++      更新时间:2023-10-16

我正在编写一个程序,将两个二进制数(最多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]; 
            }
        }
    }
}

如有任何意见或建议,不胜感激。

编辑:谢谢大家的意见,我让它工作!

你不应该有内部循环(在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;
}
const char * begin = std::find(c, c+32, '1');
size_t len = c - begin + 32;
std::cout.write(begin, len);

对同一索引使用两个fors。第一个for语句在== 0时迭代,第二个for语句从第一个语句停止的地方开始打印。