Я - абсолютно уверенное Шифрование AES, не добавляет ничто к зашифрованным данным, так как это выдало бы информацию о переменных состояния, и это - Плохая Вещь когда дело доходит до криптографии.
, Если Вы хотите смешать сжатие и шифрование, сделайте их в том порядке. Причиной являются зашифрованные данные (идеально) похож на полностью случайные данные, и алгоритмы сжатия закончат тем, что делали данные больше, из-за его неспособности на самом деле сжать любой из него и наверху бухгалтерии, которая идет с любым форматом сжатого файла.
См. Знаменитые Bit Twiddling Hacks
Большинство методов умножения / деления не нужны - компилятор сделает это автоматически, и вы просто запутаете людей.
Но есть представляют собой набор хаков типа «проверить / установить / переключить бит N», которые очень полезны при работе с оборудованием или протоколами связи.
Вы можете сжать данные, например, набор целых чисел:
1) Разделить / умножить на степень 2
foo >> = x;
(разделить на степень 2)
foo << = x;
(умножьте на степень 2)
2) Swap
x ^= y;
y = x ^ y;
x ^= y;
Я использовал поразрядные операторы, чтобы эффективно выполнять вычисления расстояния для битовых строк . В моем приложении битовые строки использовались для представления позиций в дискретном пространстве ( октодерево , если вам интересно, закодировано с помощью порядка Мортона ). Расчеты расстояния были необходимы, чтобы узнать, попадают ли точки на сетке в определенный радиус.
Подсчет установленных битов, поиск самого низкого / самого высокого установленного бита, поиск n-го сверху / снизу установленного бита и другие могут быть полезными, и стоит посмотреть на хаки для перестановки битов Сайт .
Тем не менее, такие вещи повседневно не важны. Полезно иметь библиотеку, но даже в этом случае наиболее распространенное использование является косвенным (например, с использованием контейнера битового набора). Кроме того, в идеале это будут стандартные библиотечные функции - многие из них лучше обрабатывать с помощью специализированных инструкций ЦП на некоторых платформах.
Хотя умножение / деление сдвигом кажется отличным, единственное, что мне время от времени требовалось, - это сжатие логических значений в биты. Для этого вам понадобится побитовое И / ИЛИ и, возможно, битовый сдвиг / инверсия.
Я когда-либо использовал только три с любой частотой:
Установите бит: a | = 1 << bit;
Немного очистить: a & = ~ (1 << bit);
Проверить, установлен ли бит: a & (1 << бит);
Мне нужна была функция для округления чисел до ближайшей степени двойки, поэтому я посетил веб-сайт Bit Twiddling, который появлялся несколько раз, и придумал следующее:
i--;
i |= i >> 1;
i |= i >> 2;
i |= i >> 4;
i |= i >> 8;
i |= i >> 16;
i++;
Я использую его на типе size_t
. Вероятно, это не будет хорошо работать на подписанных типах. Если вас беспокоит переносимость на платформы с разными типами размеров, добавьте в код директивы #if SIZE_MAX> = (number)
в соответствующих местах.