Количество ведущих нулевых битов

Тема в разделе "WASM.BEGINNERS", создана пользователем yus, 22 ноя 2006.

  1. yus

    yus New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2006
    Сообщения:
    3
    Есть положительный float f, надо найти такое наименьшее n, что f <= 2^n.
    Я так понимаю, это можно сделать следующим образом:

    UINT a = ceil(f);
    int n = 32 - nlz(a);
    if ( a == ( 1 << (n-1) ) ) n--;

    где nlz(x) - это количество ведущих нулевых битов в двоичном представлении.
    Вопрос: как реализовать nlz на x86? Ну либо ещё проще решить поставленную задачу=)
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    есть инструкция соотв. в наборе команд х86, которая сразу дает ответ на эту задачу
     
  3. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    можно проще
    смотрим формат http://babbage.cs.qc.edu/IEEE-754/Decimal.html
    смотрим экспоненту у нормализованного значения
    отнимаем bias = 127 и прибавляем 1
    получили n , что f < 2^n
     
  4. yus

    yus New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2006
    Сообщения:
    3
    Если мантисса равна нулю, то единицу не прибавляем и f = 2^n )
    Ок, а если у нас первоначально не float, а unsigned int?
     
  5. yus

    yus New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2006
    Сообщения:
    3
    Ну я в принципе и спрашивал, какая инструкция реализует nlz =)
    Нашел, что в PowerPC это cntlzw.
     
  6. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> Если мантисса равна нулю, то единицу не прибавляем и f = 2^n )

    как вариант можно отнимать FLT_EPSILON перед сравненим... хотя это не очень чисто

    >> если у нас первоначально не float, а unsigned int?

    bsr

    для ц от мс
    unsigned char _BitScanReverse(
    unsigned long * Index,
    unsigned long Mask
    );