Эквивалент 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 не найден.

Другие вопросы по тегам