Практические применения сдвига битов - PullRequest
2 голосов
/ 26 февраля 2012

Я полностью понимаю , как сдвигать биты. Я работал с многочисленными примерами на бумаге и в коде, и мне там не нужна помощь.

Я пытаюсь придумать примеры из реальной жизни о том, как используется сдвиг битов. Вот несколько примеров, которые я смог придумать:

  • Возможно, самый важный пример, который я мог осмыслить, был связан с порядком байтов. В системах с прямым порядком байтов младшие значащие биты сохраняются слева, а в системах с младшим порядком байтов младшие значащие биты сохраняются справа. Я полагаю, что для передачи файлов и сетей между системами, использующими стратегии с обратным порядком байтов, необходимо выполнить определенные преобразования.

  • Кажется, некоторые компиляторы и процессоры могли бы внести некоторые оптимизации при работе с любыми умножениями n ^ 2, n ^ 4 и т. Д. Биты просто сдвигаются влево. (Наоборот, я полагаю, то же самое применимо к делению, n / 2, n / 4 и т. Д.)

  • В алгоритмах шифрования. Т.е. использовать серию битовых сдвигов, реверсов и комбинаций, чтобы запутать что-либо.

Являются ли все эти точные примеры? Есть ли что-нибудь, что вы хотели бы добавить? Я потратил довольно много времени на изучение того, как реализовать сдвиг битов / переупорядочение / перестановку байтов, и я хочу знать, как это можно применять практически =)

Ответы [ 4 ]

3 голосов
/ 26 февраля 2012

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

Хеш-функции часто используют сдвиги битов как способ получить хаотическое поведение;не отличается от ваших криптографических алгоритмов.

1 голос
/ 26 февраля 2012
  1. Быстрое умножение и деление на степень 2 - особенно важно для встроенных приложений
  2. Расчет CRC - Удобно для сетей, например Ethernet
  3. Математические вычисления, требующие очень больших чисел

Просто пара с макушки головы

1 голос
/ 26 февраля 2012

Одним из распространенных применений является использование int / long в качестве последовательности значений флага, которые можно проверять, устанавливать и очищать с помощью побитовых операторов.

Не очень широко используется, но в (некоторых) шахматных играх доска и ходы представлены 64-битными целочисленными значениями (так называемые битборды), поэтому оценка допустимых ходов, ходов и т. Д. Выполняется с помощью побитовых операторов.Множество объяснений этого в сети, но это кажется довольно хорошим объяснением: http://www.frayn.net/beowulf/theory.html#bitboards.

И, наконец, вы можете обнаружить, что вам нужно посчитать количество битов, которые установлены в int /долго, в некоторых технических интервью!

1 голос
/ 26 февраля 2012

Наиболее распространенный пример использования побитового сдвига, который я знаю, - это установка и очистка битов.

uint8_t bla = INIT_VALUE;

bla |= (1U << N);   // Set N-th bit
bla &= ~(1U << N);  // Clear N-th bit
...