Позволяет сделать лучший способ смещения N
битов в массиве 8-битных целых чисел.
N - Total number of bits to shift
F = (N / 8) - Full 8 bit integers shifted
R = (N % 8) - Remaining bits that need to be shifted
Полагаю, отсюда вам нужно было бы найти наиболее оптимальный способ использования этих данных для перемещения по целым числам в массиве. Универсальные алгоритмы должны были бы применять полные целочисленные сдвиги, начиная с правой части массива и перемещая каждое целое число F
индексов. Ноль заполнить недавно пустые места. Затем, наконец, выполните R
битовое смещение для всех индексов, снова начиная справа.
В случае сдвига 0xBC
на R
битов вы можете рассчитать переполнение, выполнив побитовое И, и сдвиг, используя оператор битового сдвига:
// 0xAB shifted 4 bits is:
(0xAB & 0x0F) >> 4 // is the overflow (0x0A)
0xAB << 4 // is the shifted value (0xB0)
Имейте в виду, что 4 бита - это просто простая маска: 0x0F или просто 0b00001111. Это легко рассчитать, построить динамически, или вы даже можете использовать простую статическую справочную таблицу.
Надеюсь, это достаточно универсально. Я не очень хорошо разбираюсь в C / C ++, так что, возможно, кто-то может очистить мой синтаксис или быть более конкретным.
Бонус: если вы не сообразительны с вашим C, вы можете использовать несколько индексов массива в одно 16, 32 или даже 64-битное целое число и выполнять сдвиги. Но это, вероятно, не очень портативно, и я бы рекомендовал против этого. Просто возможная оптимизация.