Эквивалент De Bruijn LSB, но для MSB - PullRequest
1 голос
/ 16 марта 2011

Кто-нибудь знает алгоритм, похожий на LSB Де Брюина, но для MSB?Или, альтернативно, самый эффективный способ определения MSB?

Я знаю, что Log_2 (Val) сделает это, но я не знаю, является ли это наиболее эффективным методом.

Причина, по которой мне нужноэто мне нужно преобразовать little-endian в big-endian.Я знаю стандартный алгоритм для этого.Тем не менее, ввод является 64-битным, но обычно это 16-битные или 24-битные числа, так что замена целых 8 байтов вокруг ненужна в 99,9% случаев.

Ответы [ 2 ]

1 голос
/ 13 ноября 2012

Если вам нужен быстрый метод и вы можете / хотите использовать специфические для оборудования инструкции, вам следует взглянуть на x86 BSR (Битовое сканирование в обратном порядке) или аналогичную инструкцию.

Ищет в исходном операнде (втором операнде) самый старший установленный бит (1 бит). Если наиболее значимый 1 бит найдено, его битовый индекс хранится в целевом операнде (первом операнде).

xor edx, edx
mov eax, 0x12345678
bsr edx, eax

Он должен хранить 28 в edx (бит 28 - MSB). edx не изменится, если MSB не найден.

1 голос
/ 16 марта 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...