Для чего нужны побитовые операции?

Добрый день.
Я уже не считаю себя новичком в программировании, но до сих пор не понимаю для чего нужны сдвиги вправо, влево по битам. Я представлял для чего они нужны в c++(низкоуровневое программирование). но когда я встретил эти операции в javascript я впал в ступор. В книгах, что я читал я внятных разъяснений не обнаружил. Я понимаю назначение побитовых и, или, не, исключающего или, но вот сдвиги не знаю где применяются. Буду рад любому ответу.
  • Вопрос задан
  • 19907 просмотров
Решения вопроса 1
bogolt
@bogolt
Они нужны для:
  • Реализации криптографических алгоритмов
  • Реализации любых других алгоритмов требующих работу с битами
  • Чтобы пользователи языка не изобретали велосипеды


Понимаете, это ведь не особенность языка - это скорее особенность наших процессоров,принципов вычислений, ассемблера. Раз уж эти операции существуют, причем именно в том виде в каком к ним привыкли то логично предположить что многие программы и алгоритмы рассчитывают на их наличие в инструментарии разработчика. Представьте что вам пришлось бы портировать некий криптографический алгоритм использующий эти операторы на js в котором их не было бы. Допустим вы реализуете его умножая/деля на два, но затем обнаруживаете, что при умножении старший бит у вас исчезает, а должен становится самый младшим. Кроме того ваша реализация на js была бы много медленней чем встроенная в язык реализация.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Mercury13
Программист на «си с крестами» и не только
Для чего битовые сдвиги вообще существуют? А потому, что они выполняются очень простой схемой — сдвиговым регистром. И вместо того, чтобы проводить умножение (поначалу это было десятки тактов), подключаем этот самый регистр к регистрам процессора, и выполним всё за один такт. Существовала даже программа, генерирующая быстрый код умножения на константу, например, 6 — сдвинуть, сложить и ещё раз сдвинуть. И это в своё время было быстрее, чем mul — а ведь сейчас мы без зазрения совести пишем mul eax, 6.

Чего могут сдвиги, но со скрипом реализуется через всё остальное? Доступ к i-му биту.
i-й бит = (x >> i) & 1

По правилам хорошего программистского тона умножение, даже на 2 или на 4, пишется как обычное * (>> пишут, если компилятор непроходимо туп и умножение медленнее). А вот сдвиги — именно их, а не умножение — пишут, когда работают с битовыми полями.

Есть также специальные сдвиги.
* Арифметический сдвиг вправо (левый совпадает с обычным) — для чисел со знаком.
* Сдвиг-вращение — в основном для криптографии.
* Сдвиг-вращение через регистр флагов — в основном для длинной арифметики.
Ответ написан
@LazyFire
Как минимум для умножения/деления числа подходящего под формулу 2^n. В любом языке это будет выигрыш в производительности(за исключением ну очень уж умного компилятора).
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Побитовые операции нужня для того, что бы менять отдельные биты в значениях. По большей части, если не брать в расчет быстрые алгоритмы, то чаще всего побитовые операции необходимы для работы с масками. Частенько при помощи оных задают какие-то флаги, или как указал Человек я та же маска подсети зная которую и зная IP адрес текущей машины можно узнать IP адрес хоста и весь диапозон IP адресов сети за счет банальной операции побитового и. Есть еще задачи связанные с кодированием информации, есть бит/байт стаффинг, упаковка данных (привет сдвиги) и т.д.

Словом без побитовых операций тяжко бы пришлось и тогда стало бы невозможно скажем при помощи FileApi открыть какой-то бинарный формат данных на клиенте.
Ответ написан
Ваш ответ на вопрос

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

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