31#ifndef ETL_BINARY_INCLUDED
32#define ETL_BINARY_INCLUDED
42#include "static_assert.h"
49#if ETL_USING_CPP20 && ETL_USING_STL
88 template <
size_t NBITS>
91 typedef typename etl::smallest_uint_for_bits<NBITS>::type value_type;
92 static ETL_CONSTANT value_type value = (value_type(1) << (NBITS - 1)) |
max_value_for_nbits<NBITS - 1>::value;
99 typedef etl::smallest_uint_for_bits<0>::type value_type;
100 static ETL_CONSTANT value_type value = 0;
103 template <
size_t NBITS>
107 template <
size_t NBITS>
115 template <
typename T>
118#if ETL_USING_CPP20 && ETL_USING_STL
119 return std::rotl(value, 1);
125 return (value << 1U) | (value >>
SHIFT);
133 template <
typename T>
136#if ETL_USING_CPP20 && ETL_USING_STL
137 return std::rotl(value, distance);
151 return (value << distance) | (value >>
SHIFT);
160 template <
typename T>
163#if ETL_USING_CPP20 && ETL_USING_STL
164 return std::rotr(value, 1);
170 return (value >> 1U) | (value <<
SHIFT);
178 template <
typename T>
181#if ETL_USING_CPP20 && ETL_USING_STL
182 return std::rotr(value, distance);
196 return (value >> distance) | (value <<
SHIFT);
206 template <
typename T>
229 template <
typename T>
234 return (value >> 1U) ^ value;
241 template <
typename TReturn,
size_t NBITS,
typename TValue>
247 ETL_CONSTANT
size_t shift = NBITS;
270 template <
typename TReturn,
size_t NBITS,
typename TValue>
279 signed value : NBITS;
282 return (
s.value = value);
291 template <
typename TReturn,
size_t NBITS,
size_t SHIFT,
typename TValue>
301 signed value : NBITS;
304 return (
s.value = (value >>
SHIFT));
312 template <
typename TReturn,
typename TValue>
332 template <
typename TReturn,
typename TValue>
351 template <
typename T>
362 template <
typename T>
374 template <
typename T>
390 template <
size_t POSITION>
393 typedef typename etl::smallest_uint_for_bits<POSITION + 1>::type value_type;
394 static ETL_CONSTANT value_type value = value_type(1) <<
POSITION;
397 template <
size_t POSITION>
401 template <
size_t POSITION>
409 template <
typename TResult,
typename TValue>
412 ETL_STATIC_ASSERT(
sizeof(
TResult) >=
sizeof(
TValue),
"Result must be at least as large as the fill value");
424 template <
typename TResult,
typename TValue, TValue N>
427 ETL_STATIC_ASSERT(
sizeof(
TResult) >=
sizeof(
TValue),
"Result must be at least as large as the fill value");
435#if ETL_USING_8BIT_TYPES
440 template <
typename TValue>
441 ETL_CONSTEXPR14
bool has_zero_byte(TValue value)
445 const unsigned_t temp = unsigned_t(~((((unsigned_t(value) & mask) + mask) | unsigned_t(value)) | mask));
454 template <
typename TValue, TValue N>
455 ETL_CONSTEXPR14
bool has_zero_byte()
459 const unsigned_t temp = unsigned_t(~((((unsigned_t(N) & mask) + mask) | unsigned_t(N)) | mask));
468 template <
typename TValue>
469 ETL_CONSTEXPR14
bool has_byte_n(TValue value, uint8_t n)
478 template <
typename TValue, TValue N>
479 ETL_CONSTEXPR14
bool has_byte_n(TValue value)
491 template <
typename T>
494 return second ^ ((second ^ first) &
mask);
503 template <
typename T, T MASK>
506 return second ^ ((second ^ first) &
MASK);
513 template <
typename T, T Value>
516#if ETL_USING_8BIT_TYPES
521 template <
typename T>
526 value = ((value & 0xAAU) >> 1U) | ((value & 0x55U) << 1U);
527 value = ((value & 0xCCU) >> 2U) | ((value & 0x33U) << 2U);
528 value = (value >> 4U) | ((value & 0x0FU) << 4U);
534 template <u
int8_t Value>
540 static ETL_CONSTANT
uint8_t value2 =
uint8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
544 static ETL_CONSTANT
uint8_t value =
uint8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
547 template <u
int8_t Value>
548 ETL_CONSTANT uint8_t reverse_bits_const<uint8_t, Value>::value;
551 template <
int8_t Value>
552 struct reverse_bits_const<int8_t, Value>
556 static ETL_CONSTANT int8_t value1 = int8_t(((Value & 0xAAU) >> 1U) | ((Value & 0x55U) << 1U));
557 static ETL_CONSTANT int8_t value2 = int8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
561 static ETL_CONSTANT int8_t value = int8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
564 template <
int8_t Value>
565 ETL_CONSTANT int8_t reverse_bits_const<int8_t, Value>::value;
572 template <
typename T>
577 value = ((value & 0xAAAAU) >> 1U) | ((value & 0x5555U) << 1U);
578 value = ((value & 0xCCCCU) >> 2U) | ((value & 0x3333U) << 2U);
579 value = ((value & 0xF0F0U) >> 4U) | ((value & 0x0F0FU) << 4U);
580 value = (value >> 8U) | ((value & 0xFFU) << 8U);
586 template <u
int16_t Value>
592 static ETL_CONSTANT
uint16_t value2 =
uint16_t(((value1 & 0xCCCCU) >> 2U) | ((value1 & 0x3333U) << 2U));
593 static ETL_CONSTANT
uint16_t value3 =
uint16_t(((value2 & 0xF0F0U) >> 4U) | ((value2 & 0x0F0FU) << 4U));
597 static ETL_CONSTANT
uint16_t value =
uint16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
600 template <u
int16_t Value>
604 template <
int16_t Value>
610 static ETL_CONSTANT
int16_t value2 =
int16_t(((value1 & 0xCCCCU) >> 2U) | ((value1 & 0x3333U) << 2U));
611 static ETL_CONSTANT
int16_t value3 =
int16_t(((value2 & 0xF0F0U) >> 4U) | ((value2 & 0x0F0FU) << 4U));
615 static ETL_CONSTANT
int16_t value =
int16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
618 template <
int16_t Value>
625 template <
typename T>
630 value = ((value & 0xAAAAAAAAUL) >> 1U) | ((value & 0x55555555UL) << 1U);
631 value = ((value & 0xCCCCCCCCUL) >> 2U) | ((value & 0x33333333UL) << 2U);
632 value = ((value & 0xF0F0F0F0UL) >> 4U) | ((value & 0x0F0F0F0FUL) << 4U);
633 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
634 value = (value >> 16U) | ((value & 0xFFFFU) << 16U);
640 template <u
int32_t Value>
646 static ETL_CONSTANT
uint32_t value2 =
uint32_t(((value1 & 0xCCCCCCCCUL) >> 2U) | ((value1 & 0x33333333UL) << 2U));
647 static ETL_CONSTANT
uint32_t value3 =
uint32_t(((value2 & 0xF0F0F0F0UL) >> 4U) | ((value2 & 0x0F0F0F0FUL) << 4U));
648 static ETL_CONSTANT
uint32_t value4 =
uint32_t(((value3 & 0xFF00FF00UL) >> 8U) | ((value3 & 0x00FF00FFUL) << 8U));
652 static ETL_CONSTANT
uint32_t value =
uint32_t((value4 >> 16U) | ((value4 & 0xFFFFU) << 16U));
655 template <u
int32_t Value>
659 template <
int32_t Value>
665 static ETL_CONSTANT
int32_t value2 =
int32_t(((value1 & 0xCCCCCCCCUL) >> 2U) | ((value1 & 0x33333333UL) << 2U));
666 static ETL_CONSTANT
int32_t value3 =
int32_t(((value2 & 0xF0F0F0F0UL) >> 4U) | ((value2 & 0x0F0F0F0FUL) << 4U));
667 static ETL_CONSTANT
int32_t value4 =
int32_t(((value3 & 0xFF00FF00UL) >> 8U) | ((value3 & 0x00FF00FFUL) << 8U));
671 static ETL_CONSTANT
int32_t value =
int32_t((value4 >> 16U) | ((value4 & 0xFFFFUL) << 16U));
674 template <
int32_t Value>
677#if ETL_USING_64BIT_TYPES
682 template <
typename T>
687 value = ((value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((value & 0x5555555555555555ULL) << 1U);
688 value = ((value & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value & 0x3333333333333333ULL) << 2U);
689 value = ((value & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value & 0x0F0F0F0F0F0F0F0FULL) << 4U);
690 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
691 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
692 value = (value >> 32U) | ((value & 0xFFFFFFFFULL) << 32U);
698 template <u
int64_t Value>
703 static ETL_CONSTANT
uint64_t value1 =
uint64_t(((
Value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((
Value & 0x5555555555555555ULL) << 1U));
704 static ETL_CONSTANT
uint64_t value2 =
uint64_t(((value1 & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value1 & 0x3333333333333333ULL) << 2U));
705 static ETL_CONSTANT
uint64_t value3 =
uint64_t(((value2 & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value2 & 0x0F0F0F0F0F0F0F0FULL) << 4U));
706 static ETL_CONSTANT
uint64_t value4 =
uint64_t(((value3 & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value3 & 0x00FF00FF00FF00FFULL) << 8U));
707 static ETL_CONSTANT
uint64_t value5 =
uint64_t(((value4 & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value4 & 0x0000FFFF0000FFFFULL) << 16U));
711 static ETL_CONSTANT
uint64_t value =
uint64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
714 template <u
int64_t Value>
718 template <
int64_t Value>
723 static ETL_CONSTANT
int64_t value1 =
int64_t(((
Value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((
Value & 0x5555555555555555ULL) << 1U));
724 static ETL_CONSTANT
int64_t value2 =
int64_t(((value1 & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value1 & 0x3333333333333333ULL) << 2U));
725 static ETL_CONSTANT
int64_t value3 =
int64_t(((value2 & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value2 & 0x0F0F0F0F0F0F0F0FULL) << 4U));
726 static ETL_CONSTANT
int64_t value4 =
int64_t(((value3 & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value3 & 0x00FF00FF00FF00FFULL) << 8U));
727 static ETL_CONSTANT
int64_t value5 =
int64_t(((value4 & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value4 & 0x0000FFFF0000FFFFULL) << 16U));
731 static ETL_CONSTANT
int64_t value =
int64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
734 template <
int64_t Value>
742 template <
typename T>
756#if ETL_USING_8BIT_TYPES
757 template <
typename T>
770 template <
typename T>
775#if ETL_CPP23_SUPPORTED && ETL_USING_STL
776 return std::byteswap(value);
778 return (value >> 8U) | (value << 8U);
786 template <
typename T>
791#if ETL_CPP23_SUPPORTED && ETL_USING_STL
792 return std::byteswap(value);
794 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
795 value = (value >> 16U) | (value << 16U);
801#if ETL_USING_64BIT_TYPES
806 template <
typename T>
811#if ETL_CPP23_SUPPORTED && ETL_USING_STL
812 return std::byteswap(value);
814 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
815 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
816 value = (value >> 32U) | (value << 32U);
827 template <
typename T>
837#if ETL_USING_8BIT_TYPES
842 template <
typename T>
847 value ^= (value >> 4U);
848 value ^= (value >> 2U);
849 value ^= (value >> 1U);
859 template <
typename T>
864 value ^= (value >> 8U);
865 value ^= (value >> 4U);
866 value ^= (value >> 2U);
867 value ^= (value >> 1U);
876 template <
typename T>
881 value ^= (value >> 16U);
882 value ^= (value >> 8U);
883 value ^= (value >> 4U);
884 value ^= (value >> 2U);
885 value ^= (value >> 1U);
890#if ETL_USING_64BIT_TYPES
895 template <
typename T>
900 value ^= (value >> 32U);
901 value ^= (value >> 16U);
902 value ^= (value >> 8U);
903 value ^= (value >> 4U);
904 value ^= (value >> 2U);
905 value ^= (value >> 1U);
915 template <
typename T>
925#if ETL_USING_8BIT_TYPES
930 template <
typename T>
935#if ETL_CPP23_SUPPORTED && ETL_USING_STL
936 return std::popcount(value);
940 count = value - ((value >> 1U) & 0x55U);
941 count = ((count >> 2U) & 0x33U) + (count & 0x33U);
942 count = ((count >> 4U) + count) & 0x0FU;
944 return uint_least8_t(count);
953 template <
typename T>
958#if ETL_USING_CPP20 && ETL_USING_STL
959 return std::popcount(value);
963 count = value - ((value >> 1U) & 0x5555U);
964 count = ((count >> 2U) & 0x3333U) + (count & 0x3333U);
965 count = ((count >> 4U) + count) & 0x0F0FU;
966 count = ((count >> 8U) + count) & 0x00FFU;
976 template <
typename T>
981#if ETL_USING_CPP20 && ETL_USING_STL
982 return std::popcount(value);
986 count = value - ((value >> 1U) & 0x55555555UL);
987 count = ((count >> 2U) & 0x33333333UL) + (count & 0x33333333UL);
988 count = ((count >> 4U) + count) & 0x0F0F0F0FUL;
989 count = ((count >> 8U) + count) & 0x00FF00FFUL;
990 count = ((count >> 16U) + count) & 0x0000FFUL;
996#if ETL_USING_64BIT_TYPES
1001 template <
typename T>
1006#if ETL_USING_CPP20 && ETL_USING_STL
1007 return std::popcount(value);
1011 count = value - ((value >> 1U) & 0x5555555555555555ULL);
1012 count = ((count >> 2U) & 0x3333333333333333ULL) + (count & 0x3333333333333333ULL);
1013 count = ((count >> 4U) + count) & 0x0F0F0F0F0F0F0F0FULL;
1014 count = ((count >> 8U) + count) & 0x00FF00FF00FF00FFULL;
1015 count = ((count >> 16U) + count) & 0x0000FFFF0000FFFFULL;
1016 count = ((count >> 32U) + count) & 0x00000000FFFFFFFFULL;
1027 template <
typename T>
1037#if ETL_USING_8BIT_TYPES
1042 template <
typename T>
1047 value ^= value >> 4U;
1049 return (0x6996U >> value) & 1U;
1057 template <
typename T>
1062 value ^= value >> 8U;
1063 value ^= value >> 4U;
1065 return (0x6996U >> value) & 1U;
1072 template <
typename T>
1077 value ^= value >> 16U;
1078 value ^= value >> 8U;
1079 value ^= value >> 4U;
1081 return (0x6996U >> value) & 1U;
1084#if ETL_USING_64BIT_TYPES
1089 template <
typename T>
1094 value ^= value >> 32U;
1095 value ^= value >> 16U;
1096 value ^= value >> 8U;
1097 value ^= value >> 4U;
1099 return (0x69966996UL >> value) & 1U;
1107 template <
typename T>
1117#if ETL_USING_8BIT_TYPES
1123 template <
typename T>
1128#if ETL_USING_CPP20 && ETL_USING_STL
1129 return std::countr_zero(value);
1131 uint_least8_t count = 0U;
1141 if ((value & 0xFU) == 0U)
1147 if ((value & 0x3U) == 0U)
1153 if ((value & 0x1U) == 0U)
1159 count -= (value & 0x1U);
1172 template <
typename T>
1177#if ETL_USING_CPP20 && ETL_USING_STL
1178 return std::countr_zero(value);
1190 if ((value & 0xFFU) == 0U)
1196 if ((value & 0xFU) == 0U)
1202 if ((value & 0x3U) == 0U)
1208 if ((value & 0x1U) == 0U)
1214 count -= value & 0x1U;
1226 template <
typename T>
1231#if ETL_USING_CPP20 && ETL_USING_STL
1232 return std::countr_zero(value);
1244 if ((value & 0xFFFFUL) == 0
UL)
1250 if ((value & 0xFFUL) == 0
UL)
1256 if ((value & 0xFUL) == 0
UL)
1262 if ((value & 0x3UL) == 0
UL)
1268 if ((value & 0x1U) == 0U)
1274 count -= value & 0x1UL;
1281#if ETL_USING_64BIT_TYPES
1287 template <
typename T>
1292#if ETL_USING_CPP20 && ETL_USING_STL
1293 return std::countr_zero(value);
1305 if ((value & 0xFFFFFFFFULL) == 0
ULL)
1311 if ((value & 0xFFFFULL) == 0
ULL)
1317 if ((value & 0xFFULL) == 0
ULL)
1323 if ((value & 0xFULL) == 0
ULL)
1329 if ((value & 0x3ULL) == 0
ULL)
1335 if ((value & 0x1U) == 0U)
1341 count -= value & 0x1ULL;
1353 template <
typename T>
1363#if ETL_USING_8BIT_TYPES
1369 template <
typename T>
1374#if ETL_USING_CPP20 && ETL_USING_STL
1375 return std::countr_one(value);
1377 uint_least8_t count = 0U;
1379 if ((value & 0x1U) == 0x0U)
1387 if ((value & 0xFU) == 0xFU)
1393 if ((value & 0x3U) == 0x3U)
1399 if ((value & 0x1U) == 0x1U)
1405 count -= ((value & 0x1U) == 0x0U);
1418 template <
typename T>
1423#if ETL_USING_CPP20 && ETL_USING_STL
1424 return std::countr_one(value);
1428 if ((value & 0x1U) == 0x0U)
1436 if ((value & 0xFFU) == 0xFFU)
1442 if ((value & 0xFU) == 0xFU)
1448 if ((value & 0x3U) == 0x3U)
1454 if ((value & 0x1U) == 0x1U)
1460 count -= ((value & 0x1U) == 0x0U);
1472 template <
typename T>
1477#if ETL_USING_CPP20 && ETL_USING_STL
1478 return std::countr_one(value);
1482 if ((value & 0x1UL) == 0x0UL)
1490 if ((value & 0xFFFFUL) == 0xFFFFUL)
1496 if ((value & 0xFFUL) == 0xFFUL)
1502 if ((value & 0xFUL) == 0xFUL)
1508 if ((value & 0x3UL) == 0x3UL)
1514 if ((value & 0x1UL) == 0x1UL)
1520 count -= ((value & 0x1UL) == 0x0UL);
1527#if ETL_USING_64BIT_TYPES
1533 template <
typename T>
1538#if ETL_USING_CPP20 && ETL_USING_STL
1539 return std::countr_one(value);
1543 if ((value & 0x1ULL) == 0x0ULL)
1551 if ((value & 0xFFFFULL) == 0xFFFFULL)
1557 if ((value & 0xFFULL) == 0xFFULL)
1563 if ((value & 0xFULL) == 0xFULL)
1569 if ((value & 0x3ULL) == 0x3ULL)
1575 if ((value & 0x1ULL) == 0x1ULL)
1581 count -= ((value & 0x1ULL) == 0x0ULL);
1593 template <
typename T>
1603#if ETL_USING_8BIT_TYPES
1609 template <
typename T>
1614#if ETL_USING_CPP20 && ETL_USING_STL
1615 return std::countl_zero(value);
1617 uint_least8_t count = 0U;
1627 if ((value & 0xF0U) == 0U)
1633 if ((value & 0xC0U) == 0U)
1639 if ((value & 0x80U) == 0U)
1645 count -= ((value & 0x80U) == 0x80U);
1658 template <
typename T>
1663#if ETL_USING_CPP20 && ETL_USING_STL
1664 return std::countl_zero(value);
1668 if (value & 0x8000U)
1676 if ((value & 0xFF00U) == 0U)
1682 if ((value & 0xF000U) == 0U)
1688 if ((value & 0xC000U) == 0U)
1694 if ((value & 0x8000U) == 0U)
1700 count -= ((value & 0x8000U) == 0x8000U);
1712 template <
typename T>
1717#if ETL_USING_CPP20 && ETL_USING_STL
1718 return std::countl_zero(value);
1722 if (value & 0x80000000UL)
1730 if ((value & 0xFFFF0000UL) == 0U)
1736 if ((value & 0xFF000000UL) == 0U)
1742 if ((value & 0xF0000000UL) == 0U)
1748 if ((value & 0xC0000000UL) == 0U)
1754 if ((value & 0x80000000UL) == 0U)
1760 count -= ((value & 0x80000000UL) == 0x80000000UL);
1767#if ETL_USING_64BIT_TYPES
1773 template <
typename T>
1778#if ETL_USING_CPP20 && ETL_USING_STL
1779 return std::countl_zero(value);
1783 if (value & 0x8000000000000000ULL)
1791 if ((value & 0xFFFFFFFFF0000000ULL) == 0U)
1797 if ((value & 0xFFFF000000000000ULL) == 0U)
1803 if ((value & 0xFF00000000000000ULL) == 0U)
1809 if ((value & 0xF000000000000000ULL) == 0U)
1815 if ((value & 0xC000000000000000ULL) == 0U)
1821 if ((value & 0x8000000000000000ULL) == 0U)
1827 count -= ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL);
1839 template <
typename T>
1849#if ETL_USING_8BIT_TYPES
1855 template <
typename T>
1860#if ETL_USING_CPP20 && ETL_USING_STL
1861 return std::countl_one(value);
1863 uint_least8_t count = 0U;
1865 if ((value & 0x80U) == 0U)
1873 if ((value & 0xF0U) == 0xF0U)
1879 if ((value & 0xC0U) == 0xC0U)
1885 if ((value & 0x80U) == 0x80U)
1891 count -= ((value & 0x80U) == 0x0U);
1904 template <
typename T>
1909#if ETL_USING_CPP20 && ETL_USING_STL
1910 return std::countl_one(value);
1914 if ((value & 0x8000U) == 0U)
1922 if ((value & 0xFF00U) == 0xFF00U)
1928 if ((value & 0xF000U) == 0xF000U)
1934 if ((value & 0xC000U) == 0xC000U)
1940 if ((value & 0x8000U) == 0x8000U)
1946 count -= ((value & 0x8000U) == 0U);
1958 template <
typename T>
1963#if ETL_USING_CPP20 && ETL_USING_STL
1964 return std::countl_one(value);
1968 if ((value & 0x80000000UL) == 0
UL)
1976 if ((value & 0xFFFF0000UL) == 0xFFFF0000UL)
1982 if ((value & 0xFF000000UL) == 0xFF000000UL)
1988 if ((value & 0xF0000000UL) == 0xF0000000UL)
1994 if ((value & 0xC0000000UL) == 0xC0000000UL)
2000 if ((value & 0x80000000UL) == 0x80000000UL)
2006 count -= ((value & 0x80000000UL) == 0
UL);
2013#if ETL_USING_64BIT_TYPES
2019 template <
typename T>
2024#if ETL_USING_CPP20 && ETL_USING_STL
2025 return std::countl_one(value);
2029 if ((value & 0x8000000000000000ULL) == 0
ULL)
2037 if ((value & 0xFFFFFFFF00000000ULL) == 0xFFFFFFFF00000000ULL)
2043 if ((value & 0xFFFF000000000000ULL) == 0xFFFF000000000000ULL)
2049 if ((value & 0xFF00000000000000ULL) == 0xFF00000000000000ULL)
2055 if ((value & 0xF000000000000000ULL) == 0xF000000000000000ULL)
2061 if ((value & 0xC000000000000000ULL) == 0xC000000000000000ULL)
2067 if ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL)
2073 count -= ((value & 0x8000000000000000ULL) == 0
ULL);
2085 template <
typename T>
2095#if ETL_USING_8BIT_TYPES
2100 template <
typename T>
2105 uint16_t f = uint16_t(first);
2106 uint16_t s = uint16_t(second);
2108 f = (f | (f << 4U)) & 0x0F0FU;
2109 f = (f | (f << 2U)) & 0x3333U;
2110 f = (f | (f << 1U)) & 0x5555U;
2112 s = (s | (s << 4U)) & 0x0F0FU;
2113 s = (s | (s << 2U)) & 0x3333U;
2114 s = (s | (s << 1U)) & 0x5555U;
2116 return (f | (s << 1U));
2124 template <
typename T>
2132 f = (
f | (
f << 8U)) & 0x00FF00FFUL;
2133 f = (
f | (
f << 4U)) & 0x0F0F0F0FUL;
2134 f = (
f | (
f << 2U)) & 0x33333333UL;
2135 f = (
f | (
f << 1U)) & 0x55555555UL;
2137 s = (
s | (
s << 8U)) & 0x00FF00FFUL;
2138 s = (
s | (
s << 4U)) & 0x0F0F0F0FUL;
2139 s = (
s | (
s << 2U)) & 0x33333333UL;
2140 s = (
s | (
s << 1U)) & 0x55555555UL;
2142 return (
f | (
s << 1U));
2145#if ETL_USING_64BIT_TYPES
2150 template <
typename T>
2158 f = (
f | (
f << 16U)) & 0x0000FFFF0000FFFFULL;
2159 f = (
f | (
f << 8U)) & 0x00FF00FF00FF00FFULL;
2160 f = (
f | (
f << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2161 f = (
f | (
f << 2U)) & 0x3333333333333333ULL;
2162 f = (
f | (
f << 1U)) & 0x5555555555555555ULL;
2164 s = (
s | (
s << 16U)) & 0x0000FFFF0000FFFFULL;
2165 s = (
s | (
s << 8U)) & 0x00FF00FF00FF00FFULL;
2166 s = (
s | (
s << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2167 s = (
s | (
s << 2U)) & 0x3333333333333333ULL;
2168 s = (
s | (
s << 1U)) & 0x5555555555555555ULL;
2170 return (
f | (
s << 1U));
2178 template <
typename T>
2190 template <
typename T>
2201 template <
typename T>
2209 template <
typename T,
size_t NBits>
2217 template <
typename T,
size_t NBits>
2221 template <
typename T>
2222 ETL_CONSTEXPR14
T make_lsb_mask(
size_t nbits)
2231 template <
typename T,
size_t NBits>
2239 template <
typename T,
size_t NBits>
2243 template <
typename T>
2244 ETL_CONSTEXPR14
T make_msb_mask(
size_t nbits)
ETL_CONSTEXPR14 uint_least8_t first_set_bit_position(T value)
Definition binary.h:352
ETL_CONSTEXPR T binary_merge(T first, T second, T mask)
Definition binary.h:492
binary_constant
Definition binary.h:2254
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_trailing_ones(T value)
Definition binary.h:1421
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type reverse_bits(T value)
Definition binary.h:575
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type gray_to_binary(T value)
Definition binary.h:862
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type parity(T value)
Definition binary.h:1060
ETL_CONSTEXPR14 T rotate_left(T value)
Definition binary.h:116
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint32_t >::type binary_interleave(T first, T second)
Definition binary.h:2127
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_even(T value)
Definition binary.h:2203
ETL_CONSTEXPR14 uint_least8_t first_clear_bit_position(T value)
Definition binary.h:363
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_bits(T value)
Definition binary.h:956
ETL_CONSTEXPR14 TReturn fold_bits(TValue value)
Definition binary.h:242
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_trailing_zeros(T value)
Definition binary.h:1175
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_leading_ones(T value)
Definition binary.h:1907
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_leading_zeros(T value)
Definition binary.h:1661
ETL_CONSTEXPR TResult binary_fill()
Definition binary.h:425
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type reverse_bytes(T value)
Definition binary.h:773
ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
Definition binary.h:271
bit_constant
Definition binary.h:2518
ETL_CONSTEXPR T binary_to_gray(T value)
Definition binary.h:230
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_odd(T value)
Definition binary.h:2192
ETL_CONSTEXPR14 uint_least8_t first_bit_position(bool state, T value)
Definition binary.h:375
ETL_CONSTEXPR14 T rotate_right(T value)
Definition binary.h:161
Definition for non-zero NBITS.
Definition binary.h:90
#define ETL_ASSERT(b, e)
Definition error_handler.h:316
Definition exception.h:47
Definition integral_limits.h:468
is_integral
Definition type_traits_generator.h:1001
is_signed
Definition type_traits_generator.h:1011
is_unsigned
Definition type_traits_generator.h:1021
bitset_ext
Definition absolute.h:38
pair holds two objects of arbitrary type
Definition utility.h:164