Nano Hash - криптовалюты, майнинг, программирование

Как умножить целое на дробь

Мне нужно умножить целое число на дробь, используя побитовые операторы без циклов и тому подобного.

Например, мне нужно умножить на x на 3/8.

Я думал, ты бы:

int value = (x << 1) + x;  // Multiply by 3
value = (value >> 3);          // Divide by 8

Но это не работает. Я попытался найти дробь двоичного времени в Google, но это дает примеры с плавающей запятой. Я точно не знаю, предназначена ли эта домашняя работа для плавающей запятой, но я подозреваю, что нет, но готовлюсь к ней. Итак, какие-либо предложения?


Мне нужно округлить до нуля, так что есть предложения? Это не работает для номера -268435457.


  • Вы хотите сказать, что обновленный код все еще не работает? Является ли x целым числом? также, каково значение x, которое вы пробовали, и полученное value 09.09.2011
  • Это все еще не работает?! Вы внесли изменения в решение ниже, оно выглядит так... 09.09.2011
  • Решение округляется вверх, а не вниз, к 0. 09.09.2011

Ответы:


1

Вы, наверное, хотите

int value = (x << 1) + x;
value = (value >> 3);

Обратите внимание, что:

(x << 1) + 1 = 2*x + 1; // ignoring issues about overflow

Чтобы настроить отрицательные значения, вы можете явно проверить знак:

int value = (x << 1) + x;
value = value >> 3;
value = value + ((x >> 31) & 1); // for 32 bit; for 64 bit you have to use x >> 63
09.09.2011
  • А затем «значение = (значение ›› 3)» 09.09.2011
  • @Andrey обновил (думал, что это очевидно, но для полноты следует указать) 09.09.2011
  • Это неверно для числа -268435457. Я возвращаю -100663297, но должен вернуть -100663296. Он округляется. Как я могу округлить? 09.09.2011
  • Вы пытаетесь использовать отрицательное значение. Вы можете либо проверить знак и отменить окончательный результат, либо явно добавить бит знака. Я обновлю свой ответ 09.09.2011
  • Есть ли способ сделать это без условных операторов. Я могу использовать только побитовые операторы, такие как ›› ‹‹ ~ ! + & ^ 09.09.2011
  • Я не могу использовать ? и : операция, но это дает неправильный ответ для -268435457. Это дает 33554433 вместо -100663296. 09.09.2011
  • @seg_fault вы компилируете 32 или 64 бит? в 64-битном случае сдвиг должен быть ((x >> 63) & 1) 09.09.2011
  • 32 бит. Этот номер работает на вашем? Я пробовал свой несколько раз, но ничего. Это команда gcc, которую я использую: gcc -O -Wall -m32 -lm -o btest 09.09.2011
  • Этот метод не работает, если фактическим результатом является отрицательное целое число. Ввод -24 дает -8 вместо -9. 01.02.2015

  • 2

    Ты пробовал:

    int value = (x << 1) + x;  // Multiply by 3
    value = (value >> 3);      // Divide by 8
    

    то есть во втором утверждении замените «x» на «value». Кроме того, значение потеряет десятичные точки.

    09.09.2011
  • Я хочу игнорировать десятичные точки и округлять вниз, что равносильно их игнорированию. 09.09.2011

  • 3

    Чтобы избежать переполнения, вы можете привести к (long long) и обратно к (int) для окончательного результата. Чтобы >> 3 округлилось до нуля, вам нужно добавить 7 (8-1) для отрицательного числа. Есть несколько способов сделать это. Использование этих подходов дает вам -100663296.

    09.09.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..