oleja1ee7
@oleja1ee7

Почему не работает перевод из 2 в 10 и обратно?

Имеется две функции для перевода в 10 и в 2 систему
spoiler
int BinDec(char* bin, int size)
{
    int rez(0), i;
    for(i = size - 1; i >= 0; --i)
        rez += (bin[i] - 48)<<i;
    return rez;
}
char* DecBin(int chislo, int size)
{
    int i;
    char* bin = new char[size];
    for(i = size - 1; i >= 0; --i)
    {
        if(!((i + 1) % 8)){}
        bin[i] = ((chislo>>i)&1) + 48;
    }
    return bin;
}

Вывод происходит таким способом:
spoiler
const char* ch = DecBin(ui->vih1->text().toInt(),8);
        ui->vhod1->setText(QString::fromLocal8Bit(ch));

Происходит неправильный вывод данных:
ввод: 10 вывод: 01010000««««««««««««««««оюоюоюою
ввод: 173 вывод: 10110101««««««««««««««««оюоюоюою
  • Вопрос задан
  • 112 просмотров
Решения вопроса 2
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Используйте стандартные функции, коль скоро у вас есть Qt. QString умеет и в число и из числа, с указанием системы счисления. Смотрите методы toInt и number.
Ответ написан
@vanyamba-electronics
#include <iostream>
#include <cstring>

using namespace std;

unsigned int BinDec(char* bin)
{
    unsigned int rez(0), n;
    for(n = 0; n < strlen(bin); ++n) {
        rez <<= 1;
        rez += bin[n] - '0';
    }
    return rez;
}

void DecBin(unsigned int number, char* result)
{
    int n;
    for(n = 0; n < 32; ++n) {
        result[n] = (number & 0x80000000) ? '1' : '0';
        number <<= 1;
    }
    result[32] = 0;
}

int main() 
{
    char bin[] = "10110110100111100010010110111010";
    unsigned int nn = BinDec(bin);
    cout << bin << " = " << nn << endl;
	
    char *binn = new char[33];
    DecBin(nn, binn);
    cout << nn << " = " << binn << endl;
	
    if (strcmp(bin, binn) == 0)
        cout << "OK" << endl;
    else
        cout << "False" << endl;
    delete [] binn;
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
В DecBin() 2 ошибки:
1. Вы заполняете строку с конца, а нужно с начала. Обратите внимание на вывод 173 (если не брать во внимание мусорный хвост, о котором в п.2) - ответ правильный, только записанный наоборот.
2.После преобразования нужно добавить завершающий 0, т.к. на выходе у вас Си строка. Соответственно памяти нужно выделять на 1 байт больше необходимого. Из-за отсутствия завершающего нуля вывод не заканчивается в конце вашего буфера, а продолжает выводить содержимое памяти после буфера, пока не встретит нулевой байт, отсюда и мусор в конце.
Можно и не добавлять нулевой байт, но в этом случае не нужно относится к возвращаемому DecBin() указателю как к строке, а работать с ним как с массивом байт. Т.е. выводить строго заданное количество байт.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы