Jump to content

Найти первый набор

(Перенаправлен из LZCNT )

В компьютерном программном обеспечении и аппаратном обеспечении найдите первый набор ( FFS ) или найдите первым, что является битой , которая, с учетом слова без знака , [ NB 1 ] Определяет индекс или положение наименее значимого бита, установленного в одном из слов, подсчитывающего из наименее значимой битовой позиции. Почти эквивалентная операция - это подсчет, следящий за нулями ( CTZ ) или количество зацепленных нулей ( NTZ ), которое подсчитывает количество нулевых битов после наименьшего значительного бита. Дополнительная операция, которая находит индекс или положение наиболее значимого настройки, является базой журнала 2 , так называемой, поскольку она вычисляет двоичный логарифм ⌊log 2 (x) ⌋ . [ 1 ] Это тесно связано с ведущим количеством нулей ( CLZ ) или количеством ведущих нулей ( NLZ ), которое подсчитывает количество нулевых битов, предшествующих наиболее значимому биту. [ NB 2 ] Существует два общих варианта Find First Set, определение POSIX , которое начинает индексировать биты в 1, [ 2 ] Здесь помечено FFS, и вариант, который начинает индексировать биты в нуле, что эквивалентно CTZ и, таким образом, будет вызвано этим именем.

Большинство современных архитектур набора инструкций процессора предоставляют один или несколько из них в качестве операторов оборудования; Эмуляция программного обеспечения обычно предоставляется для любого, что недоступно, либо в качестве внутренней компилятора , либо в системных библиотеках .

Учитывая следующее 32-битное слово:

0000 0000 0000 0000 1000 0000 0000 1000

Операция с подсчетом Zeros вернется 3, в то время как операция, ведущая в лидировании Zeros. Полем Операция Find First Set вернет 4, указывающая на 4 -ю позицию справа. Усеченное базовое логарифмическое основание 2 составляет 15.

Точно так же, учитывая следующее 32-битное слово, бить отрицание приведенного выше слова:

1111 1111 1111 1111 0111 1111 1111 0111

Операция по графу следов вернется 3, операция ведущих графов вернет 16, а первая ноль -операция FFZ вернет 4.

Если слово равна нулю (не установленные биты), графы, ведущие нули и граф, следуя нули, оба возвращают количество битов в слово, в то время как FFS возвращает ноль. Оба логических базовых и нулевых реализации Find First Set обычно возвращают неопределенный результат для нулевого слова.

Аппаратная поддержка

[ редактировать ]

Многие архитектуры включают в себя инструкции по быстрому выполнению первого набора и/или связанных с ним операций, перечисленных ниже. Наиболее распространенной работой является ведущий подсчет нулей (CLZ), вероятно, потому что все другие операции могут быть выполнены эффективно с точки зрения ИТ (см. Свойства и отношения ).

Платформа Мнемоник Имя Ширина операнда Описание При применении на 0
ARM ( ARMV5T Architecture, а затем )
За исключением Cortex-M0/M0+/M1/M23
CLZ [ 3 ] Граф ведущих нулей 32 CLZ 32
ARM ( ARMV8-A Architecture ) CLZ Граф ведущих нулей 32, 64 CLZ Ширина операнда
AVR32 CLZ [ 4 ] Граф ведущих нулей 32 CLZ 32
Dec Alpha ctlz [ 5 ] Граф ведущих нулей 64 CLZ 64
Cttz [ 5 ] Граф следы за нули 64 CTZ 64
Intel 80386 , а затем BSF [ 6 ] Бит сканировать вперед 16, 32, 64 CTZ Неопределенный; Устанавливает нулевой флаг
BSR [ 6 ] Бит сканировать обратное 16, 32, 64 Bog Base 2 Неопределенный; Устанавливает нулевой флаг
x86 поддерживает BMI1 или ABM lzcnt [ 7 ] Граф ведущих нулей 16, 32, 64 CLZ Ширина операнда; Наборы несут флаг
x86 Поддерживаю BMI1 tzcnt [ 8 ] Граф следы за нули 16, 32, 64 CTZ Ширина операнда; Наборы несут флаг
Итания CLZ [ 9 ] Граф ведущих нулей 64 CLZ 64
MIPS32/MIPS64 CLZ [ 10 ] [ 11 ] Считайте лидирующие нули в словах 32, 64 CLZ Ширина операнда
Clo [ 10 ] [ 11 ] Считайте ведущие слова 32, 64 Clo Ширина операнда
Motorola 68020 , а затем BFFFO [ 12 ] Найдите первое в поле бит Произвольный Bog Base 2 Смещение поля + ширина поля
PDP-10 Jffo Прыгай, если найти первым 36 CLZ 0; Нет операции
Power / PowerPC / Power ISA cntlz/cntlzw/cntlzd [ 13 ] Граф ведущих нулей 32, 64 CLZ Ширина операнда
Power ISA 3.0, а затем cnttzw/cnttzd [ 14 ] Граф следы за нули 32, 64 CTZ Ширина операнда
RISC-V ("B" расширение) CLZ [ 15 ] Граф ведущих нулей 32, 64 CLZ Ширина операнда
CTZ [ 15 ] Граф следы за нули 32, 64 CTZ Ширина операнда
Sparc Oracle Architecture 2011 и позже LZCNT (синоним: LZD) [ 16 ] Ведущий нулевой счет 64 CLZ 64
Вакс FFS [ 17 ] Найти первый набор 0–32 CTZ Ширина операнда; Устанавливает нулевой флаг
IBM Z/Architecture флогр [ 18 ] Найдите самый левый 64 CLZ 64
vclz [ 18 ] Vector count ведущий нули 8, 16, 32, 64 CLZ Ширина операнда
VCTZ [ 18 ] Vector count rating Zeroes 8, 16, 32, 64 CTZ Ширина операнда

На некоторых альфа -платформах CTLZ и CTTZ эмулируются в программном обеспечении.

Поддержка инструмента и библиотеки

[ редактировать ]

Ряд компиляторов и поставщиков библиотеки поставки компилятора или библиотечных функций для выполнения первого набора и/или связанных операций, которые часто реализуются с точки зрения приведенных выше инструкций по аппаратным обеспечениям:

Инструмент/библиотека Имя Тип Тип ввода (ы) Примечания При применении на 0
Posix .1 Libc, соответствующий Libc
4.3BSD Libc
OS X 10.3 Libc [ 2 ] [ 19 ]
ffs Библиотечная функция инт Включает GLIBC . POSIX не предоставляет дополнительную базу журнала 2 / CLZ. 0
FreeBSD 5.3 Libc
OS X 10.4 Libc [ 19 ]
ffsl
fls
flsl
Библиотечная функция int,
длинный
FLS («Найти последний набор») вычисляет (база журнала 2) + 1. 0
FreeBSD 7.1 Libc [ 20 ] ffsll
flsll
Библиотечная функция долго 0
GCC 3.4.0 [ 21 ] [ 22 ]
Clang 5.x [ 23 ] [ 24 ]
__builtin_ffs[l,ll,imax]
__builtin_clz[l,ll,imax]
__builtin_ctz[l,ll,imax]
Встроенные функции без подписи Int,
без подписи долго,
без подписи долго,
uintmax_t
В документации GCC рассматривается результат неопределенного CLZ и CTZ на 0. 0 (FFS)
Visual Studio 2005 _BitScanForward[ 25 ]
_BitScanReverse[ 26 ]
Компилятор Внутренняя без подписи долго,
Unsigned __int64
Отдельное возвратное значение, чтобы указать нулевой вход Неопределенный
Visual Studio 2008 __lzcnt[ 27 ] Компилятор внутренний без подписи короткой,
без подписи Int,
Unsigned __int64
Полагается на аппаратную поддержку для инструкции LZCNT, представленной в BMI1 или ABM . Ширина операнда
Visual Studio 2012 _arm_clz[ 28 ] Компилятор внутренний без знака инт Полагается на аппаратную поддержку инструкции CLZ, представленной в архитектуре ARMV5T, а затем . ?
Компилятор Intel C ++ _bit_scan_forward
_bit_scan_reverse[ 29 ] [ 30 ]
Компилятор Внутренняя инт Неопределенный
Nvidia cuda [ 31 ] __clz Функции 32-bit, 64-bit Компилируется меньше инструкций в серии GeForce 400 32
__ffs 0
LLVM llvm.ctlz.*
llvm.cttz.*[ 32 ]
Внутренний 8, 16, 32, 64, 256 LLVM Ассамблея Ширина операнда, если 2 -й аргумент равен 0; неопределенное иначе
GHC 7.10 (база 4.8), в Data.Bits[ Цитация необходима ] countLeadingZeros
countTrailingZeros
Библиотечная функция FiniteBits b => b Язык программирования Haskell Ширина операнда
C ++ 20 Стандартная библиотека, в заголовке <bit>[ 33 ] [ 34 ] bit_ceil bit_floor
bit_width
countl_zero countl_one
countr_zero countr_one
Библиотечная функция без подписи Чар,
без подписи короткой,
без подписи Int,
без подписи долго,
без подписи долго

Свойства и отношения

[ редактировать ]

Если биты помечены, начиная с 1 (которая является соглашением, используемой в этой статье), то счета следов за первыми нулями и обнаруживают, что операции первого набора связаны с помощью CTZ ( x ) = FFS ( x ) - 1 (за исключением случаев, когда вход равен нулю). Если биты маркируются, начиная с 0 , то Count Trainling Zeros и First Set - это точно эквивалентные операции. Учитывая w биты на слово, log 2 легко вычисляется из CLZ и наоборот по log 2 ( x ) = w - 1 - Clz ( x ) .

Как показано в приведенном выше примере, находки первой ноль, ведущих графов и графы, сцепляющие операции, могут быть реализованы путем отрицания ввода и использования Find First Set, Count Leader Zeros и Count Trailing Zeros. Обратное также верно.

На платформах с эффективной операцией Log 2, такими как M68000, CTZ может быть вычислен с помощью:

ctz ( x ) = log 2 ( x & −x )

где и обозначает кусочек и −x обозначает два дополнение x . Выражение x & −x очищает все, кроме наименее, 1 бит, так что наиболее и наименее знаковые 1 бит одинаковы.

На платформах с эффективной операцией ведущей Zeros, такой как ARM и PowerPC, FFS может быть рассчитана с помощью:

ffs ( x ) = w - clz ( x & −x ) .

И наоборот, на машинах без Log 2 или CLZ операторов CLZ можно рассчитать с использованием CTZ , хотя и неэффективно:

clz = w - ctz (2 ⌈Log 2 ( x ) ⌉ ) (что зависит от CTZ возврата ) для нулевого входа

На платформах с эффективной операцией веса (подсчет населения), такой как Sparc 's POPC[ 35 ] [ 36 ] или черные ONES, [ 37 ] есть:

ctz ( x ) = popcount (( x & −x ) - 1) , [ 38 ] [ 39 ] или ctz ( x ) = popcount (~ ( x | −x )) ,
ffs ( x ) = popcount ( x ^ ~ - x ) [ 35 ]
CLZ = 32 - POPCOUNT (2 ⌈Log 2 ( x ) ⌉ − 1)

где ^ обозначает кусочек эксклюзивного-или, | обозначает кусочек или ~ обозначает кусочку отрицания.

Обратная проблема (с учетом i создает x, такой, что CTZ ( x ) = i ) может быть рассчитана с помощью левой сдвига ( 1 << i ).

Найдите первые установки и связанные с ними операции могут быть проведены на произвольно большие битовые массивы прямо, начиная с одного конца и выполняя до тех пор, пока не станет все-нулевое (для FFS , CTZ , CLZ ) или нет все-одно (для FFZ , CLO , CTO ) встречается. Структура данных дерева, которая рекурсивно использует растровые карты для отслеживания того, какие слова ненулевые, может ускорить это.

Эмуляция программного обеспечения

[ редактировать ]

Большинство процессоров, датируемых концом 1980-х годов, имеют битовые операторы для FFS или эквивалентные, но некоторые современные, такие как некоторые из серии Arm-MX, нет. Вместо аппаратных операторов для FFS, CLZ и CTZ программное обеспечение может эмулировать их с помощью сдвигов, целочисленного арифметического и бить. Существует несколько подходов в зависимости от архитектуры процессора и в меньшей степени, семантики языка программирования и качества генерации кода компилятора. Подходы могут быть свободно описаны как линейный поиск , бинарный поиск , поиск+поиск таблицы, умножение De Bruijn, преобразование/извлечение с плавающей запятой и методы оператора битов (без ветвления). Существуют компромисс между временем выполнения и пространством для хранения, а также переносимостью и эффективностью.

Программные эмуляции обычно детерминированные. Они возвращают определенный результат для всех входных значений; В частности, результат для ввода всех нулевых битов обычно 0 для FFS, а длина битов операнда для других операций.

Если у кого есть аппаратный CLZ или эквивалент, CTZ может быть эффективно вычислен с помощью операций BIT, но обратное не так: CLZ не эффективен для вычисления в отсутствие аппаратного оператора.

Функция 2 ⌈Log 2 (x) ⌉ (Собрание до ближайшей мощности двух), используя смены и бить [ 40 ] не эффективен для вычисления, как в этом 32-разрядном примере и еще более неэффективно, если у нас есть 64-битный или 128-битный операнд:

function pow2(x):
    if x = 0 return invalid  // invalid is implementation defined (not in [0,63])
    x ← x - 1
    for each y in {1, 2, 4, 8, 16}: x ← x | (x >> y)
    return x + 1

Поскольку ffs = ctz + 1 (posix) или ffs = ctz (другие реализации), можно использовать применимые алгоритмы для CTZ, с возможным окончательным этапом добавления 1 к результату и возвращением 0 вместо длины оперина для ввода Все ноль битов.

Канонический алгоритм представляет собой петли, подсчитывающий нули, начиная с LSB, пока не столкнется 1-битная:

function ctz1 (x)
    if x = 0 return w
    t ← 1
    r ← 0
    while (x & t) = 0
        t ← t << 1
        r ← r + 1
    return r

Этот алгоритм выполняет время и операции O ( n ) и на практике является непрактичным из -за большого количества условных ветвей.

Таблица поиска может устранить большинство ветвей:

table[0..2n-1] = ctz(i) for i in 0..2n-1
function ctz2 (x)
    if x = 0 return w
    r ← 0
    loop
        if (x & (2n-1)) ≠ 0
            return r + table[x & (2n-1)]
        x ← x >> n
        r ← r + n

Параметр n фиксирован (обычно 8) и представляет собой компромисс времени - пространство . Цикл также может быть полностью развернут . Но как линейный поиск, этот подход по -прежнему является O (n) в количестве битов в операнде.

Реализация бинарного поиска принимает логарифмическое количество операций и филиалов, как в этой 32-разрядной версии: [ 41 ] [ 42 ] Этот алгоритм также может помочь в таблице, заменив три нижних операторов «если» с таблицей поиска 256 с использованием первого ненулевого байта, встречающегося в качестве индекса.

function ctz3 (x)
    if x = 0 return 32
    n ← 0
    if (x & 0x0000FFFF) = 0: n ← n + 16, x ← x >> 16
    if (x & 0x000000FF) = 0: n ← n +  8, x ← x >>  8
    if (x & 0x0000000F) = 0: n ← n +  4, x ← x >>  4
    if (x & 0x00000003) = 0: n ← n +  2, x ← x >>  2
    if (x & 0x00000001) = 0: n ← n +  1
    return n

Если у аппаратного обеспечения есть оператор CLZ, наиболее эффективный подход к вычислению CTZ является:

function ctz4 (x)
    x &= -x
    return w - (clz(x) + 1)

Алгоритм для 32-битного CTZ использует последовательности De Bruijn для построения минимальной идеальной хэш-функции, которая устраняет все ветви. [ 43 ] [ 44 ] Этот алгоритм предполагает, что результат умножения усекается до 32 бит.

for i from 0 to 31: table[ ( 0x077CB531 * ( 1 << i ) ) >> 27 ] ← i  // table [0..31] initialized
function ctz5 (x)
    return table[((x & -x) * 0x077CB531) >> 27]

Выражение (x & -x) снова изолирует наименее знаменитый 1 бит. Тогда существует только 32 возможных слова, которые не знаковое умножение и хэш сдвига в правильное положение в таблице. (Этот алгоритм не обрабатывает нулевой вход.)

Канонический алгоритм исследует один бит за раз, начиная с MSB, пока не будет найден ненулевой бит, как показано в этом примере. Он выполняется во время O (n), где n-битовая длина операнда, и это не является практическим алгоритмом для общего использования.

function clz1 (x)
    if x = 0 return w
    t ← 1 << (w - 1)
    r ← 0
    while (x & t) = 0
        t ← t >> 1
        r ← r + 1
    return r

Улучшение на предыдущем подходе по циклу изучает восемь битов за раз, а затем использует 256 (2 8 ) таблица поиска входа для первого ненулевого байта. Этот подход, однако, все еще остается O (n) во время исполнения.

function clz2 (x)
    if x = 0 return w
    t ← 0xff << (w - 8)
    r ← 0
    while (x & t) = 0
        t ← t >> 8
        r ← r + 8
    return r + table[x >> (w - 8 - r)]

Бинарный поиск может сократить время выполнения до O (log 2 n):

function clz3 (x)
    if x = 0 return 32
    n ← 0
    if (x & 0xFFFF0000) = 0: n ← n + 16, x ← x << 16
    if (x & 0xFF000000) = 0: n ← n +  8, x ← x <<  8
    if (x & 0xF0000000) = 0: n ← n +  4, x ← x <<  4
    if (x & 0xC0000000) = 0: n ← n +  2, x ← x <<  2
    if (x & 0x80000000) = 0: n ← n +  1
    return n

Самые быстрые переносные подходы к моделированию CLZ-это комбинация бинарного поиска и поиска таблиц: 8-битный поиск таблицы (2 8 = 256 1-байтовые записи) могут заменить нижние 3 ветви в бинарном поиске. 64-битные операнды требуют дополнительной ветви. Можно использовать больший поиск ширины, но максимальный практический размер таблицы ограничен размером кэша данных L1 на современных процессорах, который составляет 32 КБ для многих. Сохранение ветви более чем компенсируется задержкой промаха кэша L1 .

Алгоритм, аналогичный умножению De Bruijn для CTZ, работает для CLZ, но вместо того, чтобы выделять наиболее значимый бит, он окружает до ближайшего целого числа формы 2 не −1 Используя сдвиги и бить или [ 45 ]

table[0..31] = {0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
                8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31}
function clz4 (x)
    for each y in {1, 2, 4, 8, 16}: x ← x | (x >> y)
    return table[((x * 0x07C4ACDD) >> 27) % 32]

Для процессоров с глубокими трубопроводами, такими как Prescott и более поздние процессоры Intel, может быть быстрее заменить ветви на бить и или операторы (даже если требуется еще много инструкций), чтобы избежать промывок трубопроводов для недоторенных ветвей (и эти типы ветвей по -разному по -разному по -разному по -разному непредсказуемо):

function clz5 (x)
    r = (x > 0xFFFF) << 4; x >>= r;
    q = (x > 0xFF  ) << 3; x >>= q; r |= q;
    q = (x > 0xF   ) << 2; x >>= q; r |= q;
    q = (x > 0x3   ) << 1; x >>= q; r |= q;
                                    r |= (x >> 1);
    return r;

На платформах, которые обеспечивают аппаратное преобразование целых чисел в плавающую запятую, поле показания может быть извлечено и вычтено с постоянной для вычисления подсчета ведущих нулей. Исправления необходимы для учета ошибок округления. [ 41 ] [ 46 ] Преобразование с плавающей запятой может иметь существенную задержку. Этот метод очень невозможен и обычно не рекомендуется.

int x; 
int r;
union { unsigned int u[2]; double d; } t;

t.u[LE] = 0x43300000;  // LE is 1 for little-endian
t.u[!LE] = x;
t.d -= 4503599627370496.0;
r = (t.u[LE] >> 20) - 0x3FF;  // log2
r++;  // CLZ

Приложения

[ редактировать ]

Операция ведущих нулей (CLZ) может использоваться для эффективной реализации нормализации , которая кодирует целое число как m × 2 и , где m имеет наиболее значимый бит в известной позиции (например, самая высокая позиция). Это, в свою очередь, может быть использовано для реализации подразделения Ньютона -Рафсона , выполнения целочисленного преобразования плавающей запятой в программном обеспечении и других приложениях. [ 41 ] [ 47 ]

Количество ведущих нулей (CLZ) можно использовать для вычисления 32-разрядного предиката Clz (x - y) >> 5 , где «>>» - это правый сдвиг без знака. [ 48 ] Его можно использовать для выполнения более сложных битовых операций, таких как поиск первой строки n 1 битов. [ 49 ] Выражение Clz (x-y) 1 << (16-Clz (x-1)/2) является эффективным начальным предположением для вычисления квадратного корня из 32-разрядного целого числа с использованием метода Ньютона . [ 50 ] CLZ может эффективно реализовать подавление нулевого , метод быстрого сжатия данных , которая кодирует целое число в качестве числа ведущих нулевых байтов вместе с ненулевыми байтами. [ 51 ] Он также может эффективно генерировать экспоненциально распределенные целые числа, принимая CLZ равномерно случайных целых чисел. [ 41 ]

Основа Log 2 может использоваться, чтобы предвидеть, будет ли переполнение умножения, поскольку ⌈log 2 (xy) ⌉ ≤ ⌈log 2 (x) ⌉ + ⌈log 2 (y) ⌉ . [ 52 ]

Граф ведущих нулей и графства, сцепляющих нулей, можно использовать вместе для реализации алгоритма определения петли Госпера , [ 53 ] который может найти период функции конечного диапазона, используя ограниченные ресурсы. [ 42 ]

Бинарный алгоритм GCD тратит много циклов, удаляя следы за нольки; Это может быть заменено графом, следящим за нули (CTZ) с последующим сдвигом. Подобный цикл появляется в вычислениях последовательности града .

Немного массива может быть использован для реализации очереди приоритета . В этом контексте First Set (FFS) полезен при эффективной реализации операции «POP» или «Вытянуть наивысший приоритетный элемент». Планировщик ядра Linux в реальном времени использует внутреннее использование sched_find_first_bit() Для этого. [ 54 ]

Работа с подсчетом нулей дает простое оптимальное решение задачи башни Ханои : диски пронумерованы от нуля, а при движении k номер диска CTZ ( K ) перемещается минимально возможное расстояние вправо (кружет обратно к оставленный по мере необходимости). Он также может генерировать серый код взяв произвольное слово и перевернув бит CTZ ( k ) на шаге K. , [ 42 ]

Смотрите также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Использование битовых операций на других, чем слово без знака, может дать неопределенные результаты.
  2. ^ Эти четыре операции также имеют (гораздо менее распространенные) отрицательные версии:
    • Найдите первый ноль ( FFZ ), который идентифицирует индекс наименее значимого ноль бита;
    • граф следов , который подсчитывает количество одного бита после наименее значительного нулевого бита.
    • Граф ведущих , которые считают количество одного бита, предшествующего наиболее значимому нулевым битам;
    • Найдите индекс наиболее значительного нулевого бита, который является инвертированной версией двоичного логарифма .
  1. ^ Андерсон . Найдите базовый журнал 2 целого числа с установленным MSB N в операциях O (n) (очевидный способ) .
  2. ^ Jump up to: а беременный "FFS (3)" . Руководство по программисту Linux . Архив ядра Linux . Получено 2012-01-02 .
  3. ^ «Справочник по инструкции ARM> Общие инструкции по обработке данных> CLZ» . Руководство для ассемблера Arm Developer Suite . РУКА . Получено 2012-01-03 .
  4. ^ "AVR32 Architecture Document" (PDF) (Corp072610 Ed.). Atmel Corporation . 2011. 32000d - 04/201. Архивировано из оригинала (PDF) 2017-10-25 . Получено 2016-10-22 .
  5. ^ Jump up to: а беременный Справочное руководство по архитектуре альфа (PDF) . Compaq . 2002. С. 4-32, 4-34.
  6. ^ Jump up to: а беременный Intel 64 и IA-32 Architectures Architectures Developer Руководство разработчика . Тол. 2A. Intel . С. 3-92–3-97. Заказ номер 325383.
  7. ^ AMD64 Руководство программиста AMD64 Том 3: Инструкции общего назначения и системы (PDF) . Тол. 3. Усовершенствованные микро -устройства (AMD). 2011. С. 204–205. Публикация № 24594.
  8. ^ «Руководство по программисту AMD64, Том 3: Инструкции по общему назначению и систем» (PDF) . Технология AMD64 (версия 3.28 Ed.). Усовершенствованные микро -устройства (AMD). Сентябрь 2019 [2013]. Публикация № 24594. Архивировано (PDF) из оригинала 2019-09-30 . Получено 2014-01-02 .
  9. ^ Руководство разработчика программного обеспечения Intel Itanium Architecture. Том 3: Intel Itanium набор инструкций . Тол. 3. Intel . 2010. С. 3:38. Архивировано из оригинала 2019-06-26.
  10. ^ Jump up to: а беременный MIPS Architecture для программистов. Том II-A: набор инструкций MIPS32 (Revision 3.02 Ed.). MIPS Technologies . 2011. С. 101–102. Архивировано из оригинала 2017-11-07 . Получено 2012-01-04 .
  11. ^ Jump up to: а беременный MIPS Architecture для программистов. Том II-A: набор инструкций MIPS64 (Revision 3.02 Ed.). MIPS Technologies . 2011. С. 105, 107, 122, 123.
  12. ^ Справочное руководство по программированию семейного программиста M68000 (включает в себя инструкции CPU32) (PDF) (Revision 1 Ed.). Motorola . 1992. С. 4-43–4-45. M68000PRM/AD. Архивировано из оригинала (PDF) 2019-12-08.
  13. ^ Фрей, Брэд. «Глава 3.3.11 Логические инструкции с фиксированной точкой». Книга архитектуры PowerPC (версия 2.02 Ed.). IBM . п. 70
  14. ^ «Глава 3.3.13 Логические инструкции с фиксированной точкой-Глава 3.3.13.1 64-битные логические инструкции с фиксированной точкой». Power ISA версия 3.0b . IBM . С. 95, 98.
  15. ^ Jump up to: а беременный Вольф, Клиффорд (2019-03-22). Расширение битовых манипуляций "RISC-V" B "для RISC-V" (PDF) . Github (проект) (v0.37 ed.) . Получено 2020-01-09 .
  16. ^ Oracle Sparc Architecture 2011 . Оракул . 2011 год
  17. ^ Справочное руководство по архитектуре VAX (PDF) . Корпорация цифрового оборудования (DEC). 1987. С. 70–71. Архивировано (PDF) из оригинала 2019-09-29 . Получено 2020-01-09 .
  18. ^ Jump up to: а беременный в «Глава 22. Вектор целых инструкций». IBM Z/Architecture Принципы операции (PDF) (Одиннадцатое изд.). IBM . Март 2015 г. с. 7-219–22-10. SA22-7832-10. Архивировано из оригинала (PDF) 2020-01-09 . Получено 2020-01-10 .
  19. ^ Jump up to: а беременный "FFS (3)" . Библиотека разработчиков Mac OS X. Apple, Inc. 1994-04-19 . Получено 2012-01-04 .
  20. ^ "FFS (3)" . Руководство по библиотеке FreeBSD . Проект FreeBSD . Получено 2012-01-04 .
  21. ^ «Другие встроенные функции, предоставленные GCC» . Использование коллекции компилятора GNU (GCC) . Free Software Foundation, Inc. Получено 2015-11-14 .
  22. ^ "GCC 3.4.0 ChangeLog" . GCC 3.4.0 . Free Software Foundation, Inc. Получено 2015-11-14 .
  23. ^ «Расширения языка Clang - Глава построенных функций» . Команда Clang . Получено 2017-04-09 . Clang поддерживает ряд встроенных библиотечных функций с тем же синтаксисом, что и GCC
  24. ^ «Исходный код кланг» . Команда LLVM, Университет Иллинойса в Урбана-Шампейн . Получено 2017-04-09 .
  25. ^ "_BitscanForward, _bitscanforward64" . Visual Studio 2008: Visual C ++: Intrinsics Compiler . Microsoft . Получено 2018-05-21 .
  26. ^ "_BitsCanReverse, _bitsCanReverse64" . Visual Studio 2008: Visual C ++: Intrinsics Compiler . Microsoft . Получено 2018-05-21 .
  27. ^ "__lzcnt16, __lzcnt, __lzcnt64" . Visual Studio 2008: Visual C ++: Intrinsics Compiler . Microsoft . Получено 2012-01-03 .
  28. ^ «Внутренняя рука» . Visual Studio 2012: Visual C ++: компилятор Intrinsics . Microsoft . Получено 2022-05-09 .
  29. ^ «Руководство по внутренней инспирации Intel» . Intel . Получено 2020-04-03 .
  30. ^ Intel C ++ компилятор для ссылки на внутреннюю часть Linux . Intel . 2006. с. 21
  31. ^ NVIDIA CUDA Руководство по программированию (PDF) (версия 3.0 Ed.). Нвидия . 2010. С. 92
  32. ^ " Llvm.ctlz.*'Intrinsic," llvm.cttz.*' Intrinsic " . Справочное руководство LLVM . Инфраструктура компилятора LLVM . Получено 2016-02-23 .
  33. ^ Смит, Ричард (2020-04-01). N4861 Рабочий проект, стандарт для языка программирования C ++ (PDF) . ISO/IEC. С. 1150–1153 . Получено 2020-05-25 .
  34. ^ «Стандартный заголовок библиотеки <Bit>» . cppreference.com . Получено 2020-05-25 .
  35. ^ Jump up to: а беременный Sparc International, Inc. (1992). «A.41: количество населения. Заметка для программирования» (PDF) . Руководство по архитектуре SPARC: версия 8 (версия 8 изд.). Englewood Cliffs, Нью -Джерси, США: Prentice Hall . с. 231 . ISBN  978-0-13-825001-0 .
  36. ^ Уоррен -младший, Генри С. (2013) [2002]. Хакерский восторг (2 изд.). Addison Wesley - Pearson Education, Inc. ISBN  978-0-321-84268-8 . 0-321-84268-5.
  37. ^ Ссылка на набор инструкций Blackfin (предварительное изд.). Аналоговые устройства . 2001. С. 8–24. Номер детали 82-000410-14.
  38. ^ Дитц, Генри Гордон . «Совокупные магические алгоритмы» . Университет Кентукки . Архивировано из оригинала 2019-10-31.
  39. ^ Isenberg, GERD (2019-11-03) [2012]. "BitsCanProtered" . Шахматное программирование вики (CPW) . Архивировано из оригинала 2020-01-09 . Получено 2020-01-09 .
  40. ^ Андерсон . Собрать до следующей самой высокой силы 2 .
  41. ^ Jump up to: а беременный в дюймовый Уоррен . Глава 5-3: Подсчет ведущих 0.
  42. ^ Jump up to: а беременный в Уоррен . ГЛАВА 5-4: Подсчет облегания 0.
  43. ^ Лейзерсон, Чарльз Э .; Прокоп, Харальд ; Рэндалл, Кит Х. (1998-07-07). «Использование последовательностей de Bruijn для индексации 1 в компьютерном словом» (PDF) . Лаборатория MIT по компьютерным наукам, Кембридж, Массачусетс, США. Архивировано (PDF) из оригинала 2020-01-09 . Получено 2020-01-09 .
  44. ^ Буш, Филипп (2009-03-01) [2009-02-21]. «Комплект вычисления нулей Howto» (PDF) . Архивировано (PDF) из оригинала 2016-08-01 . Получено 2020-01-09 .
  45. ^ Андерсон . Найдите базовый журнал 2 n-bit Integer в операциях O (LG (N)) с умножением и поиском .
  46. ^ Андерсон . Найдите целочисленное логарифмическое основание 2 целого числа с 64-битным IEEE Float .
  47. ^ Слосс, Эндрю Н.; Саймс, Доминик; Райт, Крис (2004). Руководство разработчика системы ARM Developer Разработка и оптимизация программного обеспечения для системы (1 изд.). Сан -Франциско, Калифорния, США: Морган Кауфманн . С. 212–213. ISBN  978-1-55860-874-0 .
  48. ^ Уоррен . Глава 2-11: Сравнение предикатов.
  49. ^ Уоррен . Глава 6-2: Найдите первую строку 1-бит данной длины.
  50. ^ Уоррен . Глава 11-1: целочисленный квадратный корень.
  51. ^ Шлегель, Бенджамин; Гемулла, Рейнер; Lehner, Wolfgang [на немецком языке] (июнь 2010 г.). «Быстрое целочисленное сжатие с использованием инструкций SIMD». Материалы шестого международного семинара по управлению данными на новом оборудовании . С. 34–40. Citeseerx   10.1.1.230.6379 . doi : 10.1145/18693889.1869394 . ISBN  978-1-45030189-3 Полем S2CID   7545142 .
  52. ^ Уоррен . Глава 2-12: обнаружение переполнения.
  53. ^ Госпер, Билл (апрель 1995 г.) [1972-02-29]. Бейкер, Генри Гивенс -младший (ред.). «Детектор петли» . Hakmem (переизданный и преобразованный изд.). Кембридж, Массачусетс, США: Лаборатория искусственного интеллекта , Массачусетский технологический институт (MIT). AI Memo 239 Пункт 132. Архивировано из оригинала 2019-10-08 . Получено 2020-01-09 .
  54. ^ AAS, Josh (2005-02-17). Понимание планировщика процессора Linux 2.6.8.1 (PDF) . Silicon Graphics, Inc. (SGI). п. 19. Архивированный (PDF) из оригинала 2017-05-19 . Получено 2020-01-09 .

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 192bda85cf0507909b3784cfe12a20c9__1717854000
URL1:https://arc.ask3.ru/arc/aa/19/c9/192bda85cf0507909b3784cfe12a20c9.html
Заголовок, (Title) документа по адресу, URL1:
Find first set - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)