Произведение чисел в двоичной СС на C++ [закрыт]

249
12 апреля 2019, 05:20

Всем привет!) Есть очень странное задание... Надо на C++ написать программу,которая производила умножение двух двоичных чисел (любых по разряду). проблема программы в чем... Нужно что бы умножение происходило в двоичной СС. Способ перевод в десятичную систему там умножение и обратный перевод не подходит... У кого нибудь есть идеи как это можно реализовать? И по возможности код,который был бы понятен новичку...

Answer 1
#define GETBIT(x,pos)   ( ((x) & ( 0x1 << (pos) )) != 0 )
    int a = 15, b = 5, c = 0;
    for (int j = 31; j >= 0; --j)
    {
        int tmp = 0;
        for (int i = 31; i >= 0; --i)
        {
            tmp = (GETBIT(a, i) & GETBIT(b, j)) == 1 ? ((tmp + 1) << 0x1) : (tmp << 0x1);
        }
        c += (tmp << j);
    }
    std::cout << c * 0.5 << std::endl;

Функция GETBIT возвращает значение из логической операции (выражение) != 0. В самом выражении возвращается либо значащий бит(именно значащий, то есть число, соответствующее двоичному, в котором единица стоит в какой-либо позиции), либо 0. Все потому что в функцию мы передаем число и искомую позицию бита(хотим узнать стоит там 0 или 1). Чтобы возвращать только 1/0 - проводим лог.операцию(так сказать нормализацию).
Далее, tmp - то что записываем в одну строчку на бумажке, после умножения верхних "битов" на нижний. Нужно заметить, что я начал считать с последнего бита в числе, чтобы сдвиг tmp << 0x1 происходил правильно. И сразу полученное произведение суммируем с окончательным числом(c), также со сдвигом(ведь при умножении, каждую новую "строчку" мы начинаем со сдвигом влево.
Также объясню, окончательный результат делю на 2, так как был лишний сдвиг в цикле(лишнее умножение на 2).

READ ALSO
С4430, С2238, C2065, C2039

С4430, С2238, C2065, C2039

много ошибок на строках 11 и 12Что я делаю не так? Непредвиденные лексемы перед 'токен', отсутствует спецификатор типа — предполагается int, и там...

234
QGIS Qt5 крашится программа из примера

QGIS Qt5 крашится программа из примера

крашится программа при запуске из примера QGIS

178
Освобождение памяти в С++

Освобождение памяти в С++

Предположим есть указатель на другой указательЯ меняю значение этого указателя (например, на nullptr)

205
Как сделать проверку на то, помещается ли значение в int?

Как сделать проверку на то, помещается ли значение в int?

Вот программа, которая по сути выводит сумму первых N элементов вектораКак выводить ошибку при попытке записи в int слишком большого числа?...

183