bits.h.xml 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <chapter xml:id="bits.h">
  2. <title><tt>__vic/bits.h</tt></title>
  3. <p>Инструменты для манипуляции битами и байтами.</p>
  4. <chapter xml:id="lo_nibble">
  5. <title><tt>lo_nibble()</tt>, <tt>hi_nibble()</tt></title>
  6. <code-block lang="C++">
  7. constexpr uint8_t lo_nibble(uint8_t byte);
  8. constexpr uint8_t hi_nibble(uint8_t byte);
  9. </code-block>
  10. <p>Возвращают значение младшего/старшего полубайта (тетрады), соответственно.
  11. </p>
  12. </chapter>
  13. <chapter xml:id="msb_ones">
  14. <title><tt>msb_ones()</tt>, <tt>lsb_ones()</tt></title>
  15. <code-block lang="C++"><![CDATA[
  16. template<class T> constexpr T lsb_ones(unsigned bits_num);
  17. template<class T> constexpr T msb_ones(unsigned bits_num);
  18. ]]></code-block>
  19. <p>Возвращают значение типа <tt>T</tt> со всеми младшими/старшими
  20. <tt>bits_num</tt> битами заполненными <tt>1</tt>, соответственно. Все остальные
  21. биты установлены в <tt>0</tt>.</p>
  22. </chapter>
  23. <chapter xml:id="get_lsbs">
  24. <title><tt>get_lsbs()</tt></title>
  25. <code-block lang="C++">
  26. template&lt;class T> constexpr T get_lsbs(T v, unsigned bits_num);
  27. </code-block>
  28. <p>Возвращает <tt>bits_num</tt> младших битов значения <tt>v</tt>. Другими
  29. словами, заполняет нулями все, кроме младших <tt>bits_num</tt> битов.</p>
  30. </chapter>
  31. <chapter xml:id="ord">
  32. <title><tt>ord()</tt></title>
  33. <code-block lang="C++">
  34. constexpr int ord(char ch);
  35. </code-block>
  36. <p>Возвращает код символа от 0 до 255.</p>
  37. <postcondition>ord(ch) >= 0</postcondition>
  38. </chapter>
  39. <chapter xml:id="popcount">
  40. <title><tt>popcount()</tt></title>
  41. <code-block lang="C++">
  42. unsigned popcount(unsigned v);
  43. unsigned popcount(unsigned long v);
  44. unsigned popcount(unsigned long long v);
  45. unsigned popcount(unsigned short v);
  46. unsigned popcount(unsigned char v);
  47. </code-block>
  48. <p>Возвращает количество единичных битов в данном значении.</p>
  49. </chapter>
  50. <chapter xml:id="msb_position">
  51. <title><tt>msb_position()</tt></title>
  52. <code-block lang="C++">
  53. unsigned msb_position(unsigned v)
  54. unsigned msb_position(unsigned long v);
  55. unsigned msb_position(unsigned long long v);
  56. unsigned msb_position(unsigned short v);
  57. unsigned msb_position(unsigned char v);
  58. </code-block>
  59. <precondition><tt>v != 0</tt></precondition>
  60. <p>Возвращает позицию самого значимого единичного бита. Результат неопределён,
  61. если <tt>v == 0</tt>.</p>
  62. </chapter>
  63. <chapter xml:id="ispow2">
  64. <title><tt>ispow2()</tt></title>
  65. <code-block lang="C++"><![CDATA[
  66. template<class UInt>
  67. bool ispow2(UInt n);
  68. ]]></code-block>
  69. <precondition><tt>UInt</tt> - беззнаковый целый тип</precondition>
  70. <p>Возвращает <tt>true</tt>, если <tt>n</tt> является целой степенью 2.</p>
  71. </chapter>
  72. <chapter xml:id="ceil2">
  73. <title><tt>ceil2()</tt></title>
  74. <code-block lang="C++"><![CDATA[
  75. template<class UInt>
  76. UInt ceil2(UInt n);
  77. ]]></code-block>
  78. <precondition><tt>UInt</tt> - беззнаковый целый тип</precondition>
  79. <p>Возвращает минимальное значение <tt>m</tt>, такое что <tt>ispow(m) &amp;&amp;
  80. m >= n</tt>. Если <tt>m</tt> непредставимо типом <tt>UInt</tt>, результат
  81. неопределён.</p>
  82. </chapter>
  83. <chapter xml:id="floor2">
  84. <title><tt>floor2()</tt></title>
  85. <code-block lang="C++"><![CDATA[
  86. template<class UInt>
  87. UInt floor2(UInt n);
  88. ]]></code-block>
  89. <precondition><tt>UInt</tt> - беззнаковый целый тип</precondition>
  90. <p>Если <tt>n != 0</tt>, возвращает максимальное значение <tt>m</tt>, такое что
  91. <tt>ispow2(m) &amp;&amp; m &lt;= n</tt>. В противном случае возвращается
  92. <tt>0</tt>.</p>
  93. </chapter>
  94. <chapter xml:id="ceil_log2">
  95. <title><tt>ceil_log2()</tt></title>
  96. <code-block lang="C++"><![CDATA[
  97. template<class UInt>
  98. unsigned ceil_log2(UInt n);
  99. ]]></code-block>
  100. <precondition><tt>UInt</tt> - беззнаковый целый тип</precondition>
  101. <p>Возвращает <tt>ceil(log2(n))</tt>, если <tt>n != 0</tt>, или 0 в
  102. противном случае.</p>
  103. </chapter>
  104. <chapter xml:id="floor_log2">
  105. <title><tt>floor_log2()</tt></title>
  106. <code-block lang="C++"><![CDATA[
  107. template<class UInt>
  108. unsigned floor_log2(UInt n);
  109. ]]></code-block>
  110. <precondition><tt>UInt</tt> - беззнаковый целый тип</precondition>
  111. <p>Возвращает <tt>floor(log2(n))</tt>, если <tt>n != 0</tt>, или 0 в
  112. противном случае.</p>
  113. </chapter>
  114. <chapter xml:id="rotl">
  115. <title><tt>rotl()</tt>, <tt>rotr()</tt></title>
  116. <code-block lang="C++">
  117. unsigned long long rotl(unsigned long long v, int shift);
  118. unsigned long rotl(unsigned long v, int shift);
  119. unsigned rotl(unsigned v, int shift);
  120. unsigned short rotl(unsigned short v, int shift);
  121. unsigned char rotl(unsigned char v, int shift);
  122. unsigned long long rotr(unsigned long long v, int shift);
  123. unsigned long rotr(unsigned long v, int shift);
  124. unsigned rotr(unsigned v, int shift);
  125. unsigned short rotr(unsigned short v, int shift);
  126. unsigned char rotr(unsigned char v, int shift);
  127. </code-block>
  128. <p>Функции выполняют циклический побитовый сдвиг (rotation) влево
  129. (<tt>rotl</tt>) или вправо (<tt>rotr</tt>).</p>
  130. <precondition><tt>0 &lt;= shift &amp;&amp; shift &lt; sizeof(v)*CHAR_BIT</tt></precondition>
  131. </chapter>
  132. <chapter xml:id="swapped_nibbles">
  133. <title><tt>swapped_nibbles()</tt></title>
  134. <code-block lang="C++">
  135. constexpr uint8_t swapped_nibbles(uint8_t b);
  136. </code-block>
  137. <p>Меняет местами младший и старший полубайт значения и возвращает его.</p>
  138. </chapter>
  139. </chapter>