@Sunter

Как реализовать побитовый сдвиг чисел, которые записаны как строки ( длинные числа хранятся в строках)?

Есть число "4294967296" 2^32 надо получить побитового сдвинув длинное число 2^64. Деление, умножение длинных чисел нельзя int-ых можно.
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Как я понял, вы пишете калькулятор. В десятичной системе, чтобы вычисленное калькулятором совпало с вычисленным на бумажке — на что ещё десятичная система? Есть два варианта.
1. Преобразовать в двоично-длинный формат (264 не входит в long long), сдвинуть, вернуть.
2. Получить 232 в десятично-длинном формате, и перемножить.
3. В зависимости от величины сдвига поступить так или этак: например, сдвиги на 1/2/3 вторым способом, а на 4 и больше — первым.
Думайте сами, что лучше.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Сдвиг на 2^64 это я так понимаю что сдвиг влево на 64 бита. Иначе смысла бы не было. Получили бы ноль.

Сдвиг влево - это умножение на 2 в степени числа сдвигов. Тоесть

2^32 * 2^64 = 2^96

(при умножении степеней показатели складываются)
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Из комментариев понятно, что это вы так пытаетесь умножение двух длинных чисел через сдвиги реализовывать. Соответственно, у вас сдвиги тоже длинные.

Можно сдвигать не двоичные цифры, а десятичные. Или вообще любые. Тогда помимо сдвига еще появляется умножение на цифру. Такой сдвиг в строке из цифр - это просто сдвиг всей строки на нужное количество позиций. Саму сдвинутую строку вам не надо и получать, в общем-то.

Основной цикл будет вроде
for (int i = 0; i < a.length(); ++i) {
  for (int j = 0; j < b.length(); ++j) {
     c[i+j] += a[i] * b[j];
  }
}


В этом коде i+ - это и есть сдвиг. a[i] - это цифра на которую приходится домножать. а b[j] - это собственно само сдвигаемое и прикладываемое число.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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