bitops_ut.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. #include "bitops.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <util/string/builder.h>
  4. template <typename T>
  5. static void TestCTZ() {
  6. for (unsigned int i = 0; i < (sizeof(T) << 3); ++i) {
  7. UNIT_ASSERT_VALUES_EQUAL(CountTrailingZeroBits(T(1) << i), i);
  8. }
  9. }
  10. template <typename T>
  11. static void TestFastClp2ForEachPowerOf2() {
  12. for (size_t i = 0; i < sizeof(T) * 8 - 1; ++i) {
  13. const auto current = T(1) << i;
  14. UNIT_ASSERT_VALUES_EQUAL(FastClp2(current), current);
  15. }
  16. UNIT_ASSERT_VALUES_EQUAL(FastClp2(T(1)), T(1));
  17. for (size_t i = 1; i < sizeof(T) * 8 - 1; ++i) {
  18. for (size_t j = 0; j < i; ++j) {
  19. const auto value = (T(1) << i) | (T(1) << j);
  20. const auto next = T(1) << (i + 1);
  21. UNIT_ASSERT_VALUES_EQUAL(FastClp2(value), next);
  22. }
  23. }
  24. }
  25. template <typename T>
  26. static T ReverseBitsSlow(T v) {
  27. T r = v; // r will be reversed bits of v; first get LSB of v
  28. ui32 s = sizeof(v) * 8 - 1; // extra shift needed at end
  29. for (v >>= 1; v; v >>= 1) {
  30. r <<= 1;
  31. r |= v & 1;
  32. --s;
  33. }
  34. r <<= s; // shift when v's highest bits are zero
  35. return r;
  36. }
  37. // DO_NOT_STYLE
  38. Y_UNIT_TEST_SUITE(TBitOpsTest) {
  39. Y_UNIT_TEST(TestCountTrailingZeroBits) {
  40. TestCTZ<unsigned int>();
  41. TestCTZ<unsigned long>();
  42. TestCTZ<unsigned long long>();
  43. }
  44. Y_UNIT_TEST(TestIsPowerOf2) {
  45. UNIT_ASSERT(!IsPowerOf2(-2));
  46. UNIT_ASSERT(!IsPowerOf2(-1));
  47. UNIT_ASSERT(!IsPowerOf2(0));
  48. UNIT_ASSERT(IsPowerOf2(1));
  49. UNIT_ASSERT(IsPowerOf2(2));
  50. UNIT_ASSERT(!IsPowerOf2(3));
  51. UNIT_ASSERT(IsPowerOf2(4));
  52. UNIT_ASSERT(!IsPowerOf2(5));
  53. UNIT_ASSERT(IsPowerOf2(0x10000000u));
  54. UNIT_ASSERT(!IsPowerOf2(0x10000001u));
  55. UNIT_ASSERT(IsPowerOf2(0x1000000000000000ull));
  56. UNIT_ASSERT(!IsPowerOf2(0x1000000000000001ull));
  57. }
  58. Y_UNIT_TEST(TestFastClp2) {
  59. TestFastClp2ForEachPowerOf2<unsigned>();
  60. TestFastClp2ForEachPowerOf2<unsigned long>();
  61. TestFastClp2ForEachPowerOf2<unsigned long long>();
  62. }
  63. Y_UNIT_TEST(TestMask) {
  64. for (ui32 i = 0; i < 64; ++i) {
  65. UNIT_ASSERT_VALUES_EQUAL(MaskLowerBits(i), (ui64{1} << i) - 1);
  66. UNIT_ASSERT_VALUES_EQUAL(InverseMaskLowerBits(i), ~MaskLowerBits(i));
  67. UNIT_ASSERT_VALUES_EQUAL(MaskLowerBits(i, i / 2), (ui64{1} << i) - 1 << (i / 2));
  68. UNIT_ASSERT_VALUES_EQUAL(InverseMaskLowerBits(i, i / 2), ~MaskLowerBits(i, i / 2));
  69. }
  70. }
  71. Y_UNIT_TEST(TestMostSignificantBit) {
  72. static_assert(MostSignificantBitCT(0) == 0, ".");
  73. static_assert(MostSignificantBitCT(1) == 0, ".");
  74. static_assert(MostSignificantBitCT(5) == 2, ".");
  75. for (ui32 i = 0; i < 64; ++i) {
  76. UNIT_ASSERT_VALUES_EQUAL(i, MostSignificantBit(ui64{1} << i));
  77. }
  78. for (ui32 i = 0; i < 63; ++i) {
  79. UNIT_ASSERT_VALUES_EQUAL(i + 1, MostSignificantBit(ui64{3} << i));
  80. }
  81. }
  82. Y_UNIT_TEST(TestLeastSignificantBit) {
  83. for (ui32 i = 0; i < 64; ++i) {
  84. UNIT_ASSERT_VALUES_EQUAL(i, LeastSignificantBit(ui64{1} << i));
  85. }
  86. for (ui32 i = 0; i < 63; ++i) {
  87. UNIT_ASSERT_VALUES_EQUAL(i, LeastSignificantBit(ui64{3} << i));
  88. }
  89. for (ui32 i = 0; i < 64; ++i) {
  90. ui64 value = (ui64(-1)) << i;
  91. UNIT_ASSERT_VALUES_EQUAL(i, LeastSignificantBit(value));
  92. }
  93. }
  94. Y_UNIT_TEST(TestCeilLog2) {
  95. UNIT_ASSERT_VALUES_EQUAL(CeilLog2(ui64{1}), 1);
  96. for (ui32 i = 2; i < 64; ++i) {
  97. UNIT_ASSERT_VALUES_EQUAL(CeilLog2(ui64{1} << i), i);
  98. UNIT_ASSERT_VALUES_EQUAL(CeilLog2((ui64{1} << i) | ui64{1}), i + 1);
  99. }
  100. }
  101. Y_UNIT_TEST(TestReverse) {
  102. for (ui64 i = 0; i < 0x100; ++i) {
  103. UNIT_ASSERT_VALUES_EQUAL(ReverseBits((ui8)i), ReverseBitsSlow((ui8)i));
  104. UNIT_ASSERT_VALUES_EQUAL(ReverseBits((ui16)i), ReverseBitsSlow((ui16)i));
  105. UNIT_ASSERT_VALUES_EQUAL(ReverseBits((ui32)i), ReverseBitsSlow((ui32)i));
  106. UNIT_ASSERT_VALUES_EQUAL(ReverseBits((ui64)i), ReverseBitsSlow((ui64)i));
  107. UNIT_ASSERT_VALUES_EQUAL(ReverseBits((ui16)~i), ReverseBitsSlow((ui16)~i));
  108. UNIT_ASSERT_VALUES_EQUAL(ReverseBits((ui32)~i), ReverseBitsSlow((ui32)~i));
  109. UNIT_ASSERT_VALUES_EQUAL(ReverseBits((ui64)~i), ReverseBitsSlow((ui64)~i));
  110. }
  111. ui32 v = 0xF0F0F0F0; // 11110000111100001111000011110000
  112. for (ui32 i = 0; i < 4; ++i) {
  113. UNIT_ASSERT_VALUES_EQUAL(ReverseBits(v, i + 1), v);
  114. UNIT_ASSERT_VALUES_EQUAL(ReverseBits(v, 4 + 2 * i, 4 - i), v);
  115. }
  116. UNIT_ASSERT_VALUES_EQUAL(ReverseBits(v, 8), 0xF0F0F00Fu);
  117. UNIT_ASSERT_VALUES_EQUAL(ReverseBits(v, 8, 4), 0xF0F0FF00u);
  118. for (ui32 i = 0; i < 0x10000; ++i) {
  119. for (ui32 j = 0; j <= 32; ++j) {
  120. UNIT_ASSERT_VALUES_EQUAL_C(i, ReverseBits(ReverseBits(i, j), j), (TString)(TStringBuilder() << i << " " << j));
  121. }
  122. }
  123. }
  124. Y_UNIT_TEST(TestRotateBitsLeft) {
  125. static_assert(RotateBitsLeftCT<ui8>(0b00000000u, 0) == 0b00000000u, "");
  126. static_assert(RotateBitsLeftCT<ui8>(0b00000001u, 0) == 0b00000001u, "");
  127. static_assert(RotateBitsLeftCT<ui8>(0b10000000u, 0) == 0b10000000u, "");
  128. static_assert(RotateBitsLeftCT<ui8>(0b00000001u, 1) == 0b00000010u, "");
  129. static_assert(RotateBitsLeftCT<ui8>(0b10000000u, 1) == 0b00000001u, "");
  130. static_assert(RotateBitsLeftCT<ui8>(0b00000101u, 1) == 0b00001010u, "");
  131. static_assert(RotateBitsLeftCT<ui8>(0b10100000u, 1) == 0b01000001u, "");
  132. static_assert(RotateBitsLeftCT<ui8>(0b10000000u, 7) == 0b01000000u, "");
  133. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b00000000u, 0), 0b00000000u);
  134. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b00000001u, 0), 0b00000001u);
  135. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b10000000u, 0), 0b10000000u);
  136. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b00000001u, 1), 0b00000010u);
  137. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b10000000u, 1), 0b00000001u);
  138. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b00000101u, 1), 0b00001010u);
  139. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b10100000u, 1), 0b01000001u);
  140. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui8>(0b10000000u, 7), 0b01000000u);
  141. static_assert(RotateBitsLeftCT<ui16>(0b0000000000000000u, 0) == 0b0000000000000000u, "");
  142. static_assert(RotateBitsLeftCT<ui16>(0b0000000000000001u, 0) == 0b0000000000000001u, "");
  143. static_assert(RotateBitsLeftCT<ui16>(0b1000000000000000u, 0) == 0b1000000000000000u, "");
  144. static_assert(RotateBitsLeftCT<ui16>(0b0000000000000001u, 1) == 0b0000000000000010u, "");
  145. static_assert(RotateBitsLeftCT<ui16>(0b1000000000000000u, 1) == 0b0000000000000001u, "");
  146. static_assert(RotateBitsLeftCT<ui16>(0b0000000000000101u, 1) == 0b0000000000001010u, "");
  147. static_assert(RotateBitsLeftCT<ui16>(0b1010000000000000u, 1) == 0b0100000000000001u, "");
  148. static_assert(RotateBitsLeftCT<ui16>(0b1000000000000000u, 15) == 0b0100000000000000u, "");
  149. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b0000000000000000u, 0), 0b0000000000000000u);
  150. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b0000000000000001u, 0), 0b0000000000000001u);
  151. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b1000000000000000u, 0), 0b1000000000000000u);
  152. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b0000000000000001u, 1), 0b0000000000000010u);
  153. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b1000000000000000u, 1), 0b0000000000000001u);
  154. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b0000000000000101u, 1), 0b0000000000001010u);
  155. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b1010000000000000u, 1), 0b0100000000000001u);
  156. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui16>(0b1000000000000000u, 15), 0b0100000000000000u);
  157. static_assert(RotateBitsLeftCT<ui32>(0b00000000000000000000000000000000u, 0) == 0b00000000000000000000000000000000u, "");
  158. static_assert(RotateBitsLeftCT<ui32>(0b00000000000000000000000000000001u, 0) == 0b00000000000000000000000000000001u, "");
  159. static_assert(RotateBitsLeftCT<ui32>(0b10000000000000000000000000000000u, 0) == 0b10000000000000000000000000000000u, "");
  160. static_assert(RotateBitsLeftCT<ui32>(0b00000000000000000000000000000001u, 1) == 0b00000000000000000000000000000010u, "");
  161. static_assert(RotateBitsLeftCT<ui32>(0b10000000000000000000000000000000u, 1) == 0b00000000000000000000000000000001u, "");
  162. static_assert(RotateBitsLeftCT<ui32>(0b00000000000000000000000000000101u, 1) == 0b00000000000000000000000000001010u, "");
  163. static_assert(RotateBitsLeftCT<ui32>(0b10100000000000000000000000000000u, 1) == 0b01000000000000000000000000000001u, "");
  164. static_assert(RotateBitsLeftCT<ui32>(0b10000000000000000000000000000000u, 31) == 0b01000000000000000000000000000000u, "");
  165. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b00000000000000000000000000000000u, 0), 0b00000000000000000000000000000000u);
  166. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b00000000000000000000000000000001u, 0), 0b00000000000000000000000000000001u);
  167. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b10000000000000000000000000000000u, 0), 0b10000000000000000000000000000000u);
  168. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b00000000000000000000000000000001u, 1), 0b00000000000000000000000000000010u);
  169. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b10000000000000000000000000000000u, 1), 0b00000000000000000000000000000001u);
  170. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b00000000000000000000000000000101u, 1), 0b00000000000000000000000000001010u);
  171. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b10100000000000000000000000000000u, 1), 0b01000000000000000000000000000001u);
  172. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui32>(0b10000000000000000000000000000000u, 31), 0b01000000000000000000000000000000u);
  173. static_assert(RotateBitsLeftCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000000u, 0) == 0b0000000000000000000000000000000000000000000000000000000000000000u, "");
  174. static_assert(RotateBitsLeftCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 0) == 0b0000000000000000000000000000000000000000000000000000000000000001u, "");
  175. static_assert(RotateBitsLeftCT<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 0) == 0b1000000000000000000000000000000000000000000000000000000000000000u, "");
  176. static_assert(RotateBitsLeftCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 1) == 0b0000000000000000000000000000000000000000000000000000000000000010u, "");
  177. static_assert(RotateBitsLeftCT<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 1) == 0b0000000000000000000000000000000000000000000000000000000000000001u, "");
  178. static_assert(RotateBitsLeftCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000101u, 1) == 0b0000000000000000000000000000000000000000000000000000000000001010u, "");
  179. static_assert(RotateBitsLeftCT<ui64>(0b1010000000000000000000000000000000000000000000000000000000000000u, 1) == 0b0100000000000000000000000000000000000000000000000000000000000001u, "");
  180. static_assert(RotateBitsLeftCT<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 63) == 0b0100000000000000000000000000000000000000000000000000000000000000u, "");
  181. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b0000000000000000000000000000000000000000000000000000000000000000u, 0), 0b0000000000000000000000000000000000000000000000000000000000000000u);
  182. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 0), 0b0000000000000000000000000000000000000000000000000000000000000001u);
  183. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 0), 0b1000000000000000000000000000000000000000000000000000000000000000u);
  184. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 1), 0b0000000000000000000000000000000000000000000000000000000000000010u);
  185. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 1), 0b0000000000000000000000000000000000000000000000000000000000000001u);
  186. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b0000000000000000000000000000000000000000000000000000000000000101u, 1), 0b0000000000000000000000000000000000000000000000000000000000001010u);
  187. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b1010000000000000000000000000000000000000000000000000000000000000u, 1), 0b0100000000000000000000000000000000000000000000000000000000000001u);
  188. UNIT_ASSERT_VALUES_EQUAL(RotateBitsLeft<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 63), 0b0100000000000000000000000000000000000000000000000000000000000000u);
  189. }
  190. Y_UNIT_TEST(TestRotateBitsRight) {
  191. static_assert(RotateBitsRightCT<ui8>(0b00000000u, 0) == 0b00000000u, "");
  192. static_assert(RotateBitsRightCT<ui8>(0b00000001u, 0) == 0b00000001u, "");
  193. static_assert(RotateBitsRightCT<ui8>(0b10000000u, 0) == 0b10000000u, "");
  194. static_assert(RotateBitsRightCT<ui8>(0b00000001u, 1) == 0b10000000u, "");
  195. static_assert(RotateBitsRightCT<ui8>(0b10000000u, 1) == 0b01000000u, "");
  196. static_assert(RotateBitsRightCT<ui8>(0b00000101u, 1) == 0b10000010u, "");
  197. static_assert(RotateBitsRightCT<ui8>(0b10100000u, 1) == 0b01010000u, "");
  198. static_assert(RotateBitsRightCT<ui8>(0b00000001u, 7) == 0b00000010u, "");
  199. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b00000000u, 0), 0b00000000u);
  200. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b00000001u, 0), 0b00000001u);
  201. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b10000000u, 0), 0b10000000u);
  202. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b00000001u, 1), 0b10000000u);
  203. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b10000000u, 1), 0b01000000u);
  204. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b00000101u, 1), 0b10000010u);
  205. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b10100000u, 1), 0b01010000u);
  206. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui8>(0b00000001u, 7), 0b00000010u);
  207. static_assert(RotateBitsRightCT<ui16>(0b0000000000000000u, 0) == 0b0000000000000000u, "");
  208. static_assert(RotateBitsRightCT<ui16>(0b0000000000000001u, 0) == 0b0000000000000001u, "");
  209. static_assert(RotateBitsRightCT<ui16>(0b1000000000000000u, 0) == 0b1000000000000000u, "");
  210. static_assert(RotateBitsRightCT<ui16>(0b0000000000000001u, 1) == 0b1000000000000000u, "");
  211. static_assert(RotateBitsRightCT<ui16>(0b1000000000000000u, 1) == 0b0100000000000000u, "");
  212. static_assert(RotateBitsRightCT<ui16>(0b0000000000000101u, 1) == 0b1000000000000010u, "");
  213. static_assert(RotateBitsRightCT<ui16>(0b1010000000000000u, 1) == 0b0101000000000000u, "");
  214. static_assert(RotateBitsRightCT<ui16>(0b0000000000000001u, 15) == 0b0000000000000010u, "");
  215. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b0000000000000000u, 0), 0b0000000000000000u);
  216. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b0000000000000001u, 0), 0b0000000000000001u);
  217. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b1000000000000000u, 0), 0b1000000000000000u);
  218. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b0000000000000001u, 1), 0b1000000000000000u);
  219. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b1000000000000000u, 1), 0b0100000000000000u);
  220. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b0000000000000101u, 1), 0b1000000000000010u);
  221. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b1010000000000000u, 1), 0b0101000000000000u);
  222. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui16>(0b0000000000000001u, 15), 0b0000000000000010u);
  223. static_assert(RotateBitsRightCT<ui32>(0b00000000000000000000000000000000u, 0) == 0b00000000000000000000000000000000u, "");
  224. static_assert(RotateBitsRightCT<ui32>(0b00000000000000000000000000000001u, 0) == 0b00000000000000000000000000000001u, "");
  225. static_assert(RotateBitsRightCT<ui32>(0b10000000000000000000000000000000u, 0) == 0b10000000000000000000000000000000u, "");
  226. static_assert(RotateBitsRightCT<ui32>(0b00000000000000000000000000000001u, 1) == 0b10000000000000000000000000000000u, "");
  227. static_assert(RotateBitsRightCT<ui32>(0b10000000000000000000000000000000u, 1) == 0b01000000000000000000000000000000u, "");
  228. static_assert(RotateBitsRightCT<ui32>(0b00000000000000000000000000000101u, 1) == 0b10000000000000000000000000000010u, "");
  229. static_assert(RotateBitsRightCT<ui32>(0b10100000000000000000000000000000u, 1) == 0b01010000000000000000000000000000u, "");
  230. static_assert(RotateBitsRightCT<ui32>(0b00000000000000000000000000000001u, 31) == 0b00000000000000000000000000000010u, "");
  231. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b00000000000000000000000000000000u, 0), 0b00000000000000000000000000000000u);
  232. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b00000000000000000000000000000001u, 0), 0b00000000000000000000000000000001u);
  233. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b10000000000000000000000000000000u, 0), 0b10000000000000000000000000000000u);
  234. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b00000000000000000000000000000001u, 1), 0b10000000000000000000000000000000u);
  235. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b10000000000000000000000000000000u, 1), 0b01000000000000000000000000000000u);
  236. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b00000000000000000000000000000101u, 1), 0b10000000000000000000000000000010u);
  237. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b10100000000000000000000000000000u, 1), 0b01010000000000000000000000000000u);
  238. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui32>(0b00000000000000000000000000000001u, 31), 0b00000000000000000000000000000010u);
  239. static_assert(RotateBitsRightCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000000u, 0) == 0b0000000000000000000000000000000000000000000000000000000000000000u, "");
  240. static_assert(RotateBitsRightCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 0) == 0b0000000000000000000000000000000000000000000000000000000000000001u, "");
  241. static_assert(RotateBitsRightCT<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 0) == 0b1000000000000000000000000000000000000000000000000000000000000000u, "");
  242. static_assert(RotateBitsRightCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 1) == 0b1000000000000000000000000000000000000000000000000000000000000000u, "");
  243. static_assert(RotateBitsRightCT<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 1) == 0b0100000000000000000000000000000000000000000000000000000000000000u, "");
  244. static_assert(RotateBitsRightCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000101u, 1) == 0b1000000000000000000000000000000000000000000000000000000000000010u, "");
  245. static_assert(RotateBitsRightCT<ui64>(0b1010000000000000000000000000000000000000000000000000000000000000u, 1) == 0b0101000000000000000000000000000000000000000000000000000000000000u, "");
  246. static_assert(RotateBitsRightCT<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 63) == 0b0000000000000000000000000000000000000000000000000000000000000010u, "");
  247. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b0000000000000000000000000000000000000000000000000000000000000000u, 0), 0b0000000000000000000000000000000000000000000000000000000000000000u);
  248. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 0), 0b0000000000000000000000000000000000000000000000000000000000000001u);
  249. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 0), 0b1000000000000000000000000000000000000000000000000000000000000000u);
  250. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 1), 0b1000000000000000000000000000000000000000000000000000000000000000u);
  251. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b1000000000000000000000000000000000000000000000000000000000000000u, 1), 0b0100000000000000000000000000000000000000000000000000000000000000u);
  252. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b0000000000000000000000000000000000000000000000000000000000000101u, 1), 0b1000000000000000000000000000000000000000000000000000000000000010u);
  253. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b1010000000000000000000000000000000000000000000000000000000000000u, 1), 0b0101000000000000000000000000000000000000000000000000000000000000u);
  254. UNIT_ASSERT_VALUES_EQUAL(RotateBitsRight<ui64>(0b0000000000000000000000000000000000000000000000000000000000000001u, 63), 0b0000000000000000000000000000000000000000000000000000000000000010u);
  255. }
  256. Y_UNIT_TEST(TestSelectBits) {
  257. ui8 firstui8Test = SelectBits<3, 4, ui8>(0b11111111u);
  258. ui8 secondui8Test = SelectBits<2, 5, ui8>(0b11101101u);
  259. UNIT_ASSERT_VALUES_EQUAL(firstui8Test, 0b00001111u);
  260. UNIT_ASSERT_VALUES_EQUAL(secondui8Test, 0b00011011u);
  261. ui16 firstui16Test = SelectBits<9, 2, ui16>(0b1111111111111111u);
  262. ui16 secondui16Test = SelectBits<3, 6, ui16>(0b1010011111010001u);
  263. UNIT_ASSERT_VALUES_EQUAL(firstui16Test, 0b0000000000000011u);
  264. UNIT_ASSERT_VALUES_EQUAL(secondui16Test, 0b0000000000111010u);
  265. ui32 firstui32Test = SelectBits<23, 31, ui32>(0b11111111111111111111111111111111u);
  266. ui32 secondui32Test = SelectBits<0, 31, ui32>(0b10001011101010011111010000111111u);
  267. UNIT_ASSERT_VALUES_EQUAL(firstui32Test, 0b00000000000000000000000111111111u);
  268. UNIT_ASSERT_VALUES_EQUAL(secondui32Test, 0b00001011101010011111010000111111);
  269. ui64 firstui64Test = SelectBits<1, 62, ui64>(0b1111000000000000000000000000000000000000000000000000000000000000u);
  270. ui64 secondui64Test = SelectBits<32, 43, ui64>(0b1111111111111111111111111111111111111111111111111111111111111111u);
  271. UNIT_ASSERT_VALUES_EQUAL(firstui64Test, 0b0011100000000000000000000000000000000000000000000000000000000000u);
  272. UNIT_ASSERT_VALUES_EQUAL(secondui64Test, 0b0000000000000000000000000000000011111111111111111111111111111111u);
  273. }
  274. Y_UNIT_TEST(TestSetBits) {
  275. ui8 firstui8Test = 0b11111111u;
  276. SetBits<3, 4, ui8>(firstui8Test, 0b00001111u);
  277. ui8 secondui8Test = 0b11101101u;
  278. SetBits<2, 7, ui8>(secondui8Test, 0b01110111u);
  279. UNIT_ASSERT_VALUES_EQUAL(firstui8Test, 0b11111111u);
  280. UNIT_ASSERT_VALUES_EQUAL(secondui8Test, 0b11011101u);
  281. ui16 firstui16Test = 0b1111111111111111u;
  282. SetBits<9, 4, ui16>(firstui16Test, 0b000000000000111u);
  283. ui16 secondui16Test = 0b1010011111010001u;
  284. SetBits<3, 15, ui16>(secondui16Test, 0b0010011111010001u);
  285. UNIT_ASSERT_VALUES_EQUAL(firstui16Test, 0b1110111111111111u);
  286. UNIT_ASSERT_VALUES_EQUAL(secondui16Test, 0b0011111010001001u);
  287. ui32 firstui32Test = 0b11111111111111111111111111111111u;
  288. SetBits<23, 31, ui32>(firstui32Test, 0b01100001111111111001111101111111u);
  289. ui32 secondui32Test = 0b10001011101010011111010000111111u;
  290. SetBits<0, 31, ui32>(secondui32Test, 0b01111111111111111111111111111111u);
  291. UNIT_ASSERT_VALUES_EQUAL(firstui32Test, 0b10111111111111111111111111111111u);
  292. UNIT_ASSERT_VALUES_EQUAL(secondui32Test, 0b11111111111111111111111111111111u);
  293. ui64 firstui64Test = 0b1111000000000000000000000000000000000000000000000000000000000000u;
  294. SetBits<1, 62, ui64>(firstui64Test, 0b0001000000000000000000000000000000000000000000000000000001010101u);
  295. ui64 secondui64Test = 0b1111111111111111111111111111111111111111111111111111111111111111u;
  296. SetBits<32, 43, ui64>(secondui64Test, 0b0000000000000000000000000000000000000111111111111111111111111111u);
  297. UNIT_ASSERT_VALUES_EQUAL(firstui64Test, 0b1010000000000000000000000000000000000000000000000000000010101010u);
  298. UNIT_ASSERT_VALUES_EQUAL(secondui64Test, 0b0000011111111111111111111111111111111111111111111111111111111111u);
  299. }
  300. }