Эта операция известна как поворот бит.
unsigned rotate_left(unsigned x, unsigned num_bits, int delta) {
unsigned rdelta = delta % num_bits;
unsigned mask = (1 << num_bits) - 1;
return ((x << rdelta) | (x >> (num_bits - rdelta))) & mask;
}
Это будет вращать bitwheel x
, содержащий num_bits
бит, оставленных delta
бит. Отрицательные сдвиги также должны работать. Эквивалентную функцию rotate_right
можно получить, изменив <<
на >>
и наоборот.
Если num_bits
- 32, и вам необходимо выполнить эту операцию очень быстро, вы можете использовать встроенные инструкции для поворота машины.
Добавления: чтобы проверить крайний правый (нулевой) бит, использование курса:
if (x & 1) { ...
Чтобы проверить битную N:
if (x & (1 << N)) { ...
Если вам нужно больше, чем 32 бита, использовать unsigned long
или unsigned long long
(зависит от вашей платформы). Если вам нужно произвольное количество бит, это решение не будет работать - вам нужно будет использовать что-то на основе, например. на std::bitset
, как во втором ответе, или на vector<bool>
.
Где ваша текущая попытка? – CoffeeandCode
Может взглянуть на оператор сдвига – WorldSEnder
Как насчет прироста int и применения остатка? – Quentin