Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Операции умножения и деления выполняющиеся с помощью операций сдвига / 10 сообщений из 10, страница 1 из 1
06.01.2006, 00:55
    #33469781
LEEDA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
Пожалуйста, объясните как можно с помощью операций ">>" и "<<" выполнить умножение или деление эквивалентное умножению или делению на число не кратное 2, т. к. как вычитала если х << 1 сдвигает значение х влево на две позиции , заполняя освобождающиеся биты нулями, что эквивалентно умножению х на 2!
...
Рейтинг: 0 / 0
06.01.2006, 03:27
    #33469807
sraider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
LEEDAПожалуйста, объясните как можно с помощью операций ">>" и "<<" выполнить умножение или деление эквивалентное умножению или делению на число не кратное 2, т. к. как вычитала если х << 1 сдвигает значение х влево на две позиции , заполняя освобождающиеся биты нулями, что эквивалентно умножению х на 2!

раскладываешь множитель по битам и складываешь соответствующие единичным битам сдвиги:
y = x << 2 + x
получаешь y=x*5 (т.к. 5.dec=101.bin)

а оно тебе зачем такое извращение?
...
Рейтинг: 0 / 0
06.01.2006, 11:38
    #33470022
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
Сдвиг "влево" на один двоичный разряд с заполнением младшего разряда нулем - это умножение на два.
Сдвиг "вправо" на один двоичный разряд с заполнением старшего знака знаковым битом - деление на два.
Поскольку младший знак всегда нулем заполняют, то сдвиг влево всегда один. А старший знак можно заполнять либо нулем, либо знаковым битом. Поэтому сдвиги вправо бывают арифметические и логические. Первый - это деление, второй - просто сдвиг.
Бывают еще циклические сдвиги , в которых в освобождаемый разряд попадает бит, спадающий с разрядной сетки с другой стороны.
...
Рейтинг: 0 / 0
06.01.2006, 12:38
    #33470136
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
LEEDAПожалуйста, объясните как можно с помощью операций ">>" и "<<" выполнить умножение или деление эквивалентное умножению или делению на число не кратное 2, т. к. как вычитала если х << 1 сдвигает значение х влево на две позиции , заполняя освобождающиеся биты нулями, что эквивалентно умножению х на 2!

1) запись типа x<<1 НЕ сдвигает значение x на ДВЕ позиции. А всего лишь на ОДНУ позицию. См. учебник по Сям.
2) Сдвиг значения(в лево) в ЛЮБОЙ СС приводит к УМНОЖЕНИЮ данного значения на ОСНОВАНИЕ данной СС. Это так сказать эээээээ фундамент... Соответственно сдвиг в право - деление... Для примера мона взглянуть на полёт Вашей мысли при умножении одного рубля на десять или сто (про рубли - чтоб ышо наглядней было :) ). Вряд ли Вы это делаете "честно" в столбик !
3) Если требуеться реализовать операции с НЕ КРАТНЫМИ двум, то лучше обратиться к опыту ранее накопленному. Катят ассемблерные примеры целочисленной математики. Пример с весами разрядов уже привели выше.


с уважением
(круглый)
...
Рейтинг: 0 / 0
06.01.2006, 21:32
    #33470870
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
Добавлю. С отрицательными целыми числами есть
свои тонкости.
...
Рейтинг: 0 / 0
06.01.2006, 23:10
    #33470927
AndreiNz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
Вообще-то, умножение в двоичной системе делается , практически так же как и в десятичной, столбиком. Сдвиг и сложение. Тот факт, что в разряде могут быть только 0 и 1 упрощает процесс. Вы либо складываете, либо нет. Посмотрите, как вы умножаете десятичные числа и попробуйте воспроизвести логику для для двоичных. Естественно, знаковые операции будут несколько сложнее.

Деление - это отдельная тема, гораздо сложнее, и я уже не помню, как оно делается.
...
Рейтинг: 0 / 0
06.01.2006, 23:37
    #33470950
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
maytonДобавлю. С отрицательными целыми числами есть
свои тонкости.

Нет никаких тонкостей. Есть разные сдвиги, арифметический и логический (и циклический еще). Арифметический сдвиг - это умножение и деление , а остальные - просто манипуляция битами.
...
Рейтинг: 0 / 0
06.01.2006, 23:59
    #33470963
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
MasterZiv
Нет никаких тонкостей. Есть разные сдвиги, арифметический и логический (и циклический еще). Арифметический сдвиг - это умножение и деление , а остальные - просто манипуляция битами.


Этим я хотел почеркнуть, что фрагмент кода, предложеный
sraider-om не является эквивалентом математического
умножения на 5 . Для отрицательных значений X
этот исходник дает непредсказуемые результаты.
В свое время я занимался оптимизацией сорсов под Ассемблер
и знаю много хитростей и трюков.
...
Рейтинг: 0 / 0
07.01.2006, 00:40
    #33470996
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
Ты маладэц, mayton! Прадалжай знать и дальши !! С новым годом !!
...
Рейтинг: 0 / 0
07.01.2006, 02:22
    #33471015
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Операции умножения и деления выполняющиеся с помощью операций сдвига
Спасиба Зив! И тебя с новой версией года.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Операции умножения и деления выполняющиеся с помощью операций сдвига / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]