Эквивалент De Bruijn LSB, но для MSB
Кто-нибудь знает алгоритм, похожий на LSB Де Брюина, но для MSB? Или поочередно самый эффективный способ определения MSB?
Я знаю, что Log_2(Val) сделает это, но я не знаю, является ли это наиболее эффективным методом.
Причина, по которой мне это нужно, в том, что мне нужно преобразовать little-endian в big-endian. Я знаю стандартный алгоритм для этого. Тем не менее, ввод является 64-битным, но обычно числа будут 16- или 24-битными, поэтому замена всех 8-ми байтов вокруг ненужна в 99,9% случаев.
2 ответа
Разве это не совсем http://graphics.stanford.edu/~seander/bithacks.html?
Если вам нужен быстрый метод и вы можете / хотите использовать специфичные для оборудования инструкции, вам следует взглянуть на x86 BSR (Bit Scan Reverse) или аналогичную инструкцию.
Ищет в исходном операнде (втором операнде) самый старший установленный бит (1 бит). Если найден наиболее значимый 1 бит, его битовый индекс сохраняется в операнде-получателе (первом операнде).
xor edx, edx
mov eax, 0x12345678
bsr edx, eax
Он должен хранить 28 в edx (бит 28 - MSB). edx не изменится, если MSB не найден.