Find first set

В програмному забезпеченні, знайди першу одиницю (англ. find first set (ffs) або find first one) це бітова операція, яка має на вході беззнакове машинне слово, і визначає найменший значимий індекс або позицію біта в слові, який приймає значення одиниці. Майже еквівалентною операцією є підрахунок залишкових нулів (англ. count trailing zeros (ctz) або number of trailing zeros (ntz)), яка дозволяє підрахувати кількість нульових біт, що слідують після останнього значимого біта зі значенням один. Додатковою операцією, яка знаходить індекс або позицію найбільш значимого набору біт є логарифм за основою 2, що обраховує двійковий логарифм .[1] Ця операція тісно пов’язана з count leading zeros (clz) або number of leading zeros (nlz), що підраховує кількість нульових бітів які передують найбільш значущому одиничному бітові. Ці чотири операції мають також інвертовані версії:

  • пошук першого нуля (find first zeroffz), яка повертає індекс останнього значимого нульового біта;
  • підрахунок залишкових одиниць (count trailing ones, яка повертає кількість одиничних біт, які слідують після останнього значимого нульового біта.
  • підрахунок початкових одиниць (count leading ones), яка підраховує кількість одиничних біт, що слідують перед найстаршим значимим нульовим бітом;
  • Операція, що повертає індекс найзначущого нульового біта, що є версією двійкового логарифму з округленням.

Існує два основних варіанти знаходження першого входження, за визначенням POSIX індексація біт починається з 1,[2] що позначено тут як "ffs", який починає індексування біт з нуля, що еквівалентно "ctz" і буде називатися так само.

Приклади

Маємо наступне 32-бітне слово:

00000000000000001000000000001000

Операція підрахунку залишкових нулів повернула б значення 3, а операція підрахунку початкових нулів поверне 16. Операція підрахунку початкових нулів залежить від довжини слова: якби це 32-бітне слово було скорочено до 16-біт, підрахунок початкових нулів би повернув значення нуль. Операція пошуку першого входження повернула б 4, що відповідало б четвертій позиції 4 з права. Логарифм за основою 2 дорівнює 15.

Апаратна підтримка

Велика кількість архітектур містять інструкції для здійснення швидкого пошуку першого значимого входження і/або відповідних операцій. Основною операцією є підрахунок початкових нулів (clz), здебільшого тому, що всі інші операції можна виконати за допомогою її.

ПлатформаСкороченняНазваРозміри слівОписРезультат при нульовому вході
ARM (Архітектура ARMv5T і пізніші)clz[3]Підрахунок початкових нульових розрядів32clz32
ARM (Архітектура ARMv8-A)clzПідрахунок початкових нульових розрядів32, 64clzвхідний розмір
AVR32clz[4]Підрахунок початкових нульових розрядів32clz32
DEC Alphactlz[5]Підрахунок початкових нульових розрядів64clz64
DEC Alphacttz[5]Підрахунок залишкових нульових розрядів64ctz64
Intel 80386 і пізнішіbsf[6]Пряме сканування біт16, 32, 64ctzНе визначено, встановлює нульовий прапорець
Intel 80386 і пізнішіbsr[6]Зворотнє сканування біт16, 32, 64логарифм за основою 2Не визначено, встановлює нульовий прапорець
x86 з підтримкою команд маніпуляції бітами ABMlzcnt[7]Підрахунок початкових нульових розрядів16, 32, 64clzвхідний розмір, задає прапорець CF (carry flag)
x86 з підтримкою BMI1tzcnt[8]Підрахунок залишкових нульових розрядів16, 32, 64ctzвхідний розмір, задає несучий прапорець
Itaniumclz[9]Підрахунок початкових нульових розрядів64clz64
MIPSclz[10][11]Підрахунок початкових нульових розрядів в слові32, 64clzвхідний розмір
MIPSclo[10][11]Підрахунок початкових одиниць в слові32, 64cloвхідний розмір
Motorola 68020 і пізнішіbfffo[12]Пошук першої одиниці в бітовому полідовільнологарифм за основою 2зміщення + ширина
PDP-10jffoПерейти, якщо знайдено першу одиницю36ctzНе виконує перехід
POWER/PowerPC/Power Architecturecntlz/cntlzw/cntlzd[13]Підрахунок початкових нульових розрядів32, 64clzвхідний розмір
SPARC Oracle Architecture 2011 і пізнішіlzcnt (synonym: lzd) [14]Підрахунок початкових нульових розрядів64clz64

Примітки

  1. Anderson, Sean Eron. Find the log base 2 of an integer with the MSB N set in O(N) operations (the obvious way) (англ.).
  2. FFS(3). Linux Programmer's Manual. The Linux Kernel Archives. Процитовано 2 січня 2012.
  3. ARM Instruction Reference > ARM general data processing instructions > CLZ. ARM Developer Suite Assembler Guide. ARM. Процитовано 3 січня 2012.
  4. AVR32 Architecture Document. Atmel. Архів оригіналу за 18 березня 2012. Процитовано 22 жовтня 2016.
  5. Alpha Architecture Reference Manual. Compaq. 2002. с. 4–32, 4–34.
  6. Intel 64 and IA-32 Architectures Software Developer Manual. Volume 2A: Intel. с. 3–92–3–97. Order number 325383.
  7. AMD64 Architecture Programmer's Manual Volume 3: General Purpose and System Instructions3. AMD. 2011. с. 204–5.
  8. AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions (PDF). amd.com. AMD. October 2013. Процитовано 2 січня 2014.
  9. Intel Itanium Architecture Software Developer's Manual. Volume 3: Intel Itanium Instruction Set. Intel. 2010. с. 3:38.
  10. MIPS Architecture For Programmers. Volume II-A: The MIPS32 Instruction Set (вид. Revision 3.02). MIPS Technologies. 2011. с. 101–102.
  11. MIPS Architecture For Programmers. Volume II-A: The MIPS64 Instruction Set (вид. Revision 3.02). MIPS Technologies. 2011. с. 105, 107, 122, 123.
  12. M68000 Family Programmer's Reference Manual. Motorola. 1992. с. 4–43–4–45.
  13. Frey, Brad. PowerPC Architecture Book (вид. Version 2.02). 3.3.11 Fixed-Point Logical Instructions: IBM. с. 70.
  14. Oracle SPARC Architecture 2011. Oracle.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.