C ++ удаляет начальные нули в двоичном массиве - PullRequest
1 голос
/ 16 сентября 2011

Я делаю программу, которая складывает два двоичных числа (до 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 ]

2 голосов
/ 16 сентября 2011

У вас не должно быть этого внутреннего цикла (внутри 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 бита.

Iоставим на ваше усмотрение, следует ли вам выводить разделитель между переносом и значением (и оставлять эту строку закомментированной) или использовать перенос, чтобы изначально принудительно установить 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 голос
/ 16 сентября 2011
const char * begin = std::find(c, c+32, '1');
size_t len = c - begin + 32;
std::cout.write(begin, len);
0 голосов
/ 16 сентября 2011

Используйте два форса по одному и тому же индексу.Первый для итераций while == 0, второй печатает начиная с того места, где остановился первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...