31#ifndef ETL_BINARY_INCLUDED
32#define ETL_BINARY_INCLUDED
42#include "static_assert.h"
50#if ETL_USING_CPP20 && ETL_USING_STL
89 template <
size_t NBITS>
92 typedef typename etl::smallest_uint_for_bits<NBITS>::type value_type;
93 static ETL_CONSTANT value_type value = (value_type(1) << (NBITS - 1)) |
max_value_for_nbits<NBITS - 1>::value;
100 typedef etl::smallest_uint_for_bits<0>::type value_type;
101 static ETL_CONSTANT value_type value = 0;
104 template <
size_t NBITS>
108 template <
size_t NBITS>
116 template <
typename T>
119#if ETL_USING_CPP20 && ETL_USING_STL
120 return std::rotl(value, 1);
126 return (value << 1U) | (value >>
SHIFT);
134 template <
typename T>
137#if ETL_USING_CPP20 && ETL_USING_STL
138 return std::rotl(value, distance);
152 return (value << distance) | (value >>
SHIFT);
161 template <
typename T>
164#if ETL_USING_CPP20 && ETL_USING_STL
165 return std::rotr(value, 1);
171 return (value >> 1U) | (value <<
SHIFT);
179 template <
typename T>
182#if ETL_USING_CPP20 && ETL_USING_STL
183 return std::rotr(value, distance);
197 return (value >> distance) | (value <<
SHIFT);
207 template <
typename T>
230 template <
typename T>
235 return (value >> 1U) ^ value;
242 template <
typename TReturn,
size_t NBITS,
typename TValue>
248 ETL_CONSTANT
size_t shift = NBITS;
271 template <
typename TReturn,
size_t NBITS,
typename TValue>
280 signed value : NBITS;
283 return (
s.value = value);
292 template <
typename TReturn,
size_t NBITS,
size_t SHIFT,
typename TValue>
302 signed value : NBITS;
305 return (
s.value = (value >>
SHIFT));
313 template <
typename TReturn,
typename TValue>
333 template <
typename TReturn,
typename TValue>
352 template <
size_t POSITION>
355 typedef typename etl::smallest_uint_for_bits<POSITION + 1U>::type value_type;
356 static ETL_CONSTANT value_type value = value_type(1) <<
POSITION;
359 template <
size_t POSITION>
363 template <
size_t POSITION>
364 using bit_t =
typename etl::bit<POSITION>::value_type;
368 template <
size_t POSITION>
376 template <
typename TResult,
typename TValue>
379 ETL_STATIC_ASSERT(
sizeof(
TResult) >=
sizeof(
TValue),
"Result must be at least as large as the fill value");
391 template <
typename TResult,
typename TValue, TValue N>
394 ETL_STATIC_ASSERT(
sizeof(
TResult) >=
sizeof(
TValue),
"Result must be at least as large as the fill value");
402#if ETL_USING_8BIT_TYPES
407 template <
typename TValue>
421 template <
typename TValue, TValue N>
435 template <
typename TValue>
445 template <
typename TValue, TValue N>
458 template <
typename T>
461 return second ^ ((second ^ first) &
mask);
470 template <
typename T, T MASK>
473 return second ^ ((second ^ first) &
MASK);
480 template <
typename T, T Value>
483#if ETL_USING_8BIT_TYPES
488 template <
typename T>
493 value = ((value & 0xAAU) >> 1U) | ((value & 0x55U) << 1U);
494 value = ((value & 0xCCU) >> 2U) | ((value & 0x33U) << 2U);
495 value = (value >> 4U) | ((value & 0x0FU) << 4U);
501 template <u
int8_t Value>
507 static ETL_CONSTANT
uint8_t value2 =
uint8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
511 static ETL_CONSTANT
uint8_t value =
uint8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
514 template <u
int8_t Value>
515 ETL_CONSTANT
uint8_t reverse_bits_const<uint8_t, Value>::value;
518 template <
int8_t Value>
524 static ETL_CONSTANT
int8_t value2 =
int8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
528 static ETL_CONSTANT
int8_t value =
int8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
531 template <
int8_t Value>
532 ETL_CONSTANT
int8_t reverse_bits_const<int8_t, Value>::value;
539 template <
typename T>
544 value = ((value & 0xAAAAU) >> 1U) | ((value & 0x5555U) << 1U);
545 value = ((value & 0xCCCCU) >> 2U) | ((value & 0x3333U) << 2U);
546 value = ((value & 0xF0F0U) >> 4U) | ((value & 0x0F0FU) << 4U);
547 value = (value >> 8U) | ((value & 0xFFU) << 8U);
553 template <u
int16_t Value>
559 static ETL_CONSTANT
uint16_t value2 =
uint16_t(((value1 & 0xCCCCU) >> 2U) | ((value1 & 0x3333U) << 2U));
560 static ETL_CONSTANT
uint16_t value3 =
uint16_t(((value2 & 0xF0F0U) >> 4U) | ((value2 & 0x0F0FU) << 4U));
564 static ETL_CONSTANT
uint16_t value =
uint16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
567 template <u
int16_t Value>
571 template <
int16_t Value>
577 static ETL_CONSTANT
int16_t value2 =
int16_t(((value1 & 0xCCCCU) >> 2U) | ((value1 & 0x3333U) << 2U));
578 static ETL_CONSTANT
int16_t value3 =
int16_t(((value2 & 0xF0F0U) >> 4U) | ((value2 & 0x0F0FU) << 4U));
582 static ETL_CONSTANT
int16_t value =
int16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
585 template <
int16_t Value>
592 template <
typename T>
597 value = ((value & 0xAAAAAAAAUL) >> 1U) | ((value & 0x55555555UL) << 1U);
598 value = ((value & 0xCCCCCCCCUL) >> 2U) | ((value & 0x33333333UL) << 2U);
599 value = ((value & 0xF0F0F0F0UL) >> 4U) | ((value & 0x0F0F0F0FUL) << 4U);
600 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
601 value = (value >> 16U) | ((value & 0xFFFFU) << 16U);
607 template <u
int32_t Value>
613 static ETL_CONSTANT
uint32_t value2 =
uint32_t(((value1 & 0xCCCCCCCCUL) >> 2U) | ((value1 & 0x33333333UL) << 2U));
614 static ETL_CONSTANT
uint32_t value3 =
uint32_t(((value2 & 0xF0F0F0F0UL) >> 4U) | ((value2 & 0x0F0F0F0FUL) << 4U));
615 static ETL_CONSTANT
uint32_t value4 =
uint32_t(((value3 & 0xFF00FF00UL) >> 8U) | ((value3 & 0x00FF00FFUL) << 8U));
619 static ETL_CONSTANT
uint32_t value =
uint32_t((value4 >> 16U) | ((value4 & 0xFFFFU) << 16U));
622 template <u
int32_t Value>
626 template <
int32_t Value>
632 static ETL_CONSTANT
int32_t value2 =
int32_t(((value1 & 0xCCCCCCCCUL) >> 2U) | ((value1 & 0x33333333UL) << 2U));
633 static ETL_CONSTANT
int32_t value3 =
int32_t(((value2 & 0xF0F0F0F0UL) >> 4U) | ((value2 & 0x0F0F0F0FUL) << 4U));
634 static ETL_CONSTANT
int32_t value4 =
int32_t(((value3 & 0xFF00FF00UL) >> 8U) | ((value3 & 0x00FF00FFUL) << 8U));
638 static ETL_CONSTANT
int32_t value =
int32_t((value4 >> 16U) | ((value4 & 0xFFFFUL) << 16U));
641 template <
int32_t Value>
644#if ETL_USING_64BIT_TYPES
649 template <
typename T>
654 value = ((value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((value & 0x5555555555555555ULL) << 1U);
655 value = ((value & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value & 0x3333333333333333ULL) << 2U);
656 value = ((value & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value & 0x0F0F0F0F0F0F0F0FULL) << 4U);
657 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
658 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
659 value = (value >> 32U) | ((value & 0xFFFFFFFFULL) << 32U);
665 template <u
int64_t Value>
670 static ETL_CONSTANT
uint64_t value1 =
uint64_t(((
Value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((
Value & 0x5555555555555555ULL) << 1U));
671 static ETL_CONSTANT
uint64_t value2 =
uint64_t(((value1 & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value1 & 0x3333333333333333ULL) << 2U));
672 static ETL_CONSTANT
uint64_t value3 =
uint64_t(((value2 & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value2 & 0x0F0F0F0F0F0F0F0FULL) << 4U));
673 static ETL_CONSTANT
uint64_t value4 =
uint64_t(((value3 & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value3 & 0x00FF00FF00FF00FFULL) << 8U));
674 static ETL_CONSTANT
uint64_t value5 =
uint64_t(((value4 & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value4 & 0x0000FFFF0000FFFFULL) << 16U));
678 static ETL_CONSTANT
uint64_t value =
uint64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
681 template <u
int64_t Value>
685 template <
int64_t Value>
690 static ETL_CONSTANT
int64_t value1 =
int64_t(((
Value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((
Value & 0x5555555555555555ULL) << 1U));
691 static ETL_CONSTANT
int64_t value2 =
int64_t(((value1 & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value1 & 0x3333333333333333ULL) << 2U));
692 static ETL_CONSTANT
int64_t value3 =
int64_t(((value2 & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value2 & 0x0F0F0F0F0F0F0F0FULL) << 4U));
693 static ETL_CONSTANT
int64_t value4 =
int64_t(((value3 & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value3 & 0x00FF00FF00FF00FFULL) << 8U));
694 static ETL_CONSTANT
int64_t value5 =
int64_t(((value4 & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value4 & 0x0000FFFF0000FFFFULL) << 16U));
698 static ETL_CONSTANT
int64_t value =
int64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
701 template <
int64_t Value>
709 template <
typename T>
723#if ETL_USING_8BIT_TYPES
724 template <
typename T>
737 template <
typename T>
742#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
743 return std::byteswap(value);
745 return (value >> 8U) | (value << 8U);
753 template <
typename T>
758#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
759 return std::byteswap(value);
761 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
762 value = (value >> 16U) | (value << 16U);
768#if ETL_USING_64BIT_TYPES
773 template <
typename T>
778#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
779 return std::byteswap(value);
781 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
782 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
783 value = (value >> 32U) | (value << 32U);
794 template <
typename T>
804#if ETL_USING_8BIT_TYPES
809 template <
typename T>
814 value ^= (value >> 4U);
815 value ^= (value >> 2U);
816 value ^= (value >> 1U);
826 template <
typename T>
831 value ^= (value >> 8U);
832 value ^= (value >> 4U);
833 value ^= (value >> 2U);
834 value ^= (value >> 1U);
843 template <
typename T>
848 value ^= (value >> 16U);
849 value ^= (value >> 8U);
850 value ^= (value >> 4U);
851 value ^= (value >> 2U);
852 value ^= (value >> 1U);
857#if ETL_USING_64BIT_TYPES
862 template <
typename T>
867 value ^= (value >> 32U);
868 value ^= (value >> 16U);
869 value ^= (value >> 8U);
870 value ^= (value >> 4U);
871 value ^= (value >> 2U);
872 value ^= (value >> 1U);
882 template <
typename T>
892#if ETL_USING_8BIT_TYPES
897 template <
typename T>
902#if ETL_CPP23_SUPPORTED && ETL_USING_STL
903 return std::popcount(value);
907 count = value - ((value >> 1U) & 0x55U);
908 count = ((count >> 2U) & 0x33U) + (count & 0x33U);
909 count = ((count >> 4U) + count) & 0x0FU;
920 template <
typename T>
925#if ETL_USING_CPP20 && ETL_USING_STL
926 return std::popcount(value);
930 count = value - ((value >> 1U) & 0x5555U);
931 count = ((count >> 2U) & 0x3333U) + (count & 0x3333U);
932 count = ((count >> 4U) + count) & 0x0F0FU;
933 count = ((count >> 8U) + count) & 0x00FFU;
943 template <
typename T>
948#if ETL_USING_CPP20 && ETL_USING_STL
949 return std::popcount(value);
953 count = value - ((value >> 1U) & 0x55555555UL);
954 count = ((count >> 2U) & 0x33333333UL) + (count & 0x33333333UL);
955 count = ((count >> 4U) + count) & 0x0F0F0F0FUL;
956 count = ((count >> 8U) + count) & 0x00FF00FFUL;
957 count = ((count >> 16U) + count) & 0x0000FFUL;
963#if ETL_USING_64BIT_TYPES
968 template <
typename T>
973#if ETL_USING_CPP20 && ETL_USING_STL
974 return std::popcount(value);
978 count = value - ((value >> 1U) & 0x5555555555555555ULL);
979 count = ((count >> 2U) & 0x3333333333333333ULL) + (count & 0x3333333333333333ULL);
980 count = ((count >> 4U) + count) & 0x0F0F0F0F0F0F0F0FULL;
981 count = ((count >> 8U) + count) & 0x00FF00FF00FF00FFULL;
982 count = ((count >> 16U) + count) & 0x0000FFFF0000FFFFULL;
983 count = ((count >> 32U) + count) & 0x00000000FFFFFFFFULL;
994 template <
typename T>
1004#if ETL_USING_8BIT_TYPES
1009 template <
typename T>
1014 value ^= value >> 4U;
1016 return (0x6996U >> value) & 1U;
1024 template <
typename T>
1029 value ^= value >> 8U;
1030 value ^= value >> 4U;
1032 return (0x6996U >> value) & 1U;
1039 template <
typename T>
1044 value ^= value >> 16U;
1045 value ^= value >> 8U;
1046 value ^= value >> 4U;
1048 return (0x6996U >> value) & 1U;
1051#if ETL_USING_64BIT_TYPES
1056 template <
typename T>
1061 value ^= value >> 32U;
1062 value ^= value >> 16U;
1063 value ^= value >> 8U;
1064 value ^= value >> 4U;
1066 return (0x69966996UL >> value) & 1U;
1074 template <
typename T>
1084#if ETL_USING_8BIT_TYPES
1090 template <
typename T>
1095#if ETL_USING_CPP20 && ETL_USING_STL
1096 return std::countr_zero(value);
1108 if ((value & 0xFU) == 0
U)
1114 if ((value & 0x3U) == 0
U)
1120 if ((value & 0x1U) == 0
U)
1126 count -= (value & 0x1U);
1139 template <
typename T>
1144#if ETL_USING_CPP20 && ETL_USING_STL
1145 return std::countr_zero(value);
1157 if ((value & 0xFFU) == 0
U)
1163 if ((value & 0xFU) == 0
U)
1169 if ((value & 0x3U) == 0
U)
1175 if ((value & 0x1U) == 0
U)
1181 count -= value & 0x1U;
1193 template <
typename T>
1198#if ETL_USING_CPP20 && ETL_USING_STL
1199 return std::countr_zero(value);
1211 if ((value & 0xFFFFUL) == 0
UL)
1217 if ((value & 0xFFUL) == 0
UL)
1223 if ((value & 0xFUL) == 0
UL)
1229 if ((value & 0x3UL) == 0
UL)
1235 if ((value & 0x1U) == 0
U)
1241 count -= value & 0x1UL;
1248#if ETL_USING_64BIT_TYPES
1254 template <
typename T>
1259#if ETL_USING_CPP20 && ETL_USING_STL
1260 return std::countr_zero(value);
1272 if ((value & 0xFFFFFFFFULL) == 0
ULL)
1278 if ((value & 0xFFFFULL) == 0
ULL)
1284 if ((value & 0xFFULL) == 0
ULL)
1290 if ((value & 0xFULL) == 0
ULL)
1296 if ((value & 0x3ULL) == 0
ULL)
1302 if ((value & 0x1U) == 0
U)
1308 count -= value & 0x1ULL;
1320 template <
typename T>
1330#if ETL_USING_8BIT_TYPES
1336 template <
typename T>
1341#if ETL_USING_CPP20 && ETL_USING_STL
1342 return std::countr_one(value);
1346 if ((value & 0x1U) == 0x0U)
1354 if ((value & 0xFU) == 0xFU)
1360 if ((value & 0x3U) == 0x3U)
1366 if ((value & 0x1U) == 0x1U)
1372 count -= ((value & 0x1U) == 0x0U);
1385 template <
typename T>
1390#if ETL_USING_CPP20 && ETL_USING_STL
1391 return std::countr_one(value);
1395 if ((value & 0x1U) == 0x0U)
1403 if ((value & 0xFFU) == 0xFFU)
1409 if ((value & 0xFU) == 0xFU)
1415 if ((value & 0x3U) == 0x3U)
1421 if ((value & 0x1U) == 0x1U)
1427 count -= ((value & 0x1U) == 0x0U);
1439 template <
typename T>
1444#if ETL_USING_CPP20 && ETL_USING_STL
1445 return std::countr_one(value);
1449 if ((value & 0x1UL) == 0x0UL)
1457 if ((value & 0xFFFFUL) == 0xFFFFUL)
1463 if ((value & 0xFFUL) == 0xFFUL)
1469 if ((value & 0xFUL) == 0xFUL)
1475 if ((value & 0x3UL) == 0x3UL)
1481 if ((value & 0x1UL) == 0x1UL)
1487 count -= ((value & 0x1UL) == 0x0UL);
1494#if ETL_USING_64BIT_TYPES
1500 template <
typename T>
1505#if ETL_USING_CPP20 && ETL_USING_STL
1506 return std::countr_one(value);
1510 if ((value & 0x1ULL) == 0x0ULL)
1518 if ((value & 0xFFFFULL) == 0xFFFFULL)
1524 if ((value & 0xFFULL) == 0xFFULL)
1530 if ((value & 0xFULL) == 0xFULL)
1536 if ((value & 0x3ULL) == 0x3ULL)
1542 if ((value & 0x1ULL) == 0x1ULL)
1548 count -= ((value & 0x1ULL) == 0x0ULL);
1560 template <
typename T>
1570#if ETL_USING_8BIT_TYPES
1576 template <
typename T>
1581#if ETL_USING_CPP20 && ETL_USING_STL
1582 return std::countl_zero(value);
1594 if ((value & 0xF0U) == 0
U)
1600 if ((value & 0xC0U) == 0
U)
1606 if ((value & 0x80U) == 0
U)
1612 count -= ((value & 0x80U) == 0x80U);
1625 template <
typename T>
1630#if ETL_USING_CPP20 && ETL_USING_STL
1631 return std::countl_zero(value);
1635 if (value & 0x8000U)
1643 if ((value & 0xFF00U) == 0
U)
1649 if ((value & 0xF000U) == 0
U)
1655 if ((value & 0xC000U) == 0
U)
1661 if ((value & 0x8000U) == 0
U)
1667 count -= ((value & 0x8000U) == 0x8000U);
1679 template <
typename T>
1684#if ETL_USING_CPP20 && ETL_USING_STL
1685 return std::countl_zero(value);
1689 if (value & 0x80000000UL)
1697 if ((value & 0xFFFF0000UL) == 0
U)
1703 if ((value & 0xFF000000UL) == 0
U)
1709 if ((value & 0xF0000000UL) == 0
U)
1715 if ((value & 0xC0000000UL) == 0
U)
1721 if ((value & 0x80000000UL) == 0
U)
1727 count -= ((value & 0x80000000UL) == 0x80000000UL);
1734#if ETL_USING_64BIT_TYPES
1740 template <
typename T>
1745#if ETL_USING_CPP20 && ETL_USING_STL
1746 return std::countl_zero(value);
1750 if (value & 0x8000000000000000ULL)
1758 if ((value & 0xFFFFFFFFF0000000ULL) == 0
U)
1764 if ((value & 0xFFFF000000000000ULL) == 0
U)
1770 if ((value & 0xFF00000000000000ULL) == 0
U)
1776 if ((value & 0xF000000000000000ULL) == 0
U)
1782 if ((value & 0xC000000000000000ULL) == 0
U)
1788 if ((value & 0x8000000000000000ULL) == 0
U)
1794 count -= ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL);
1806 template <
typename T>
1816#if ETL_USING_8BIT_TYPES
1822 template <
typename T>
1827#if ETL_USING_CPP20 && ETL_USING_STL
1828 return std::countl_one(value);
1832 if ((value & 0x80U) == 0
U)
1840 if ((value & 0xF0U) == 0xF0U)
1846 if ((value & 0xC0U) == 0xC0U)
1852 if ((value & 0x80U) == 0x80U)
1858 count -= ((value & 0x80U) == 0x0U);
1871 template <
typename T>
1876#if ETL_USING_CPP20 && ETL_USING_STL
1877 return std::countl_one(value);
1881 if ((value & 0x8000U) == 0
U)
1889 if ((value & 0xFF00U) == 0xFF00U)
1895 if ((value & 0xF000U) == 0xF000U)
1901 if ((value & 0xC000U) == 0xC000U)
1907 if ((value & 0x8000U) == 0x8000U)
1913 count -= ((value & 0x8000U) == 0
U);
1925 template <
typename T>
1930#if ETL_USING_CPP20 && ETL_USING_STL
1931 return std::countl_one(value);
1935 if ((value & 0x80000000UL) == 0
UL)
1943 if ((value & 0xFFFF0000UL) == 0xFFFF0000UL)
1949 if ((value & 0xFF000000UL) == 0xFF000000UL)
1955 if ((value & 0xF0000000UL) == 0xF0000000UL)
1961 if ((value & 0xC0000000UL) == 0xC0000000UL)
1967 if ((value & 0x80000000UL) == 0x80000000UL)
1973 count -= ((value & 0x80000000UL) == 0
UL);
1980#if ETL_USING_64BIT_TYPES
1986 template <
typename T>
1991#if ETL_USING_CPP20 && ETL_USING_STL
1992 return std::countl_one(value);
1996 if ((value & 0x8000000000000000ULL) == 0
ULL)
2004 if ((value & 0xFFFFFFFF00000000ULL) == 0xFFFFFFFF00000000ULL)
2010 if ((value & 0xFFFF000000000000ULL) == 0xFFFF000000000000ULL)
2016 if ((value & 0xFF00000000000000ULL) == 0xFF00000000000000ULL)
2022 if ((value & 0xF000000000000000ULL) == 0xF000000000000000ULL)
2028 if ((value & 0xC000000000000000ULL) == 0xC000000000000000ULL)
2034 if ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL)
2040 count -= ((value & 0x8000000000000000ULL) == 0
ULL);
2052 template <
typename T>
2067 template <
typename T>
2078 template <
typename T>
2090 template <
typename T>
2101#if ETL_USING_8BIT_TYPES
2106 template <
typename T>
2114 f = (
f | (
f << 4U)) & 0x0F0FU;
2115 f = (
f | (
f << 2U)) & 0x3333U;
2116 f = (
f | (
f << 1U)) & 0x5555U;
2118 s = (
s | (
s << 4U)) & 0x0F0FU;
2119 s = (
s | (
s << 2U)) & 0x3333U;
2120 s = (
s | (
s << 1U)) & 0x5555U;
2122 return (
f | (
s << 1U));
2130 template <
typename T>
2138 f = (
f | (
f << 8U)) & 0x00FF00FFUL;
2139 f = (
f | (
f << 4U)) & 0x0F0F0F0FUL;
2140 f = (
f | (
f << 2U)) & 0x33333333UL;
2141 f = (
f | (
f << 1U)) & 0x55555555UL;
2143 s = (
s | (
s << 8U)) & 0x00FF00FFUL;
2144 s = (
s | (
s << 4U)) & 0x0F0F0F0FUL;
2145 s = (
s | (
s << 2U)) & 0x33333333UL;
2146 s = (
s | (
s << 1U)) & 0x55555555UL;
2148 return (
f | (
s << 1U));
2151#if ETL_USING_64BIT_TYPES
2156 template <
typename T>
2164 f = (
f | (
f << 16U)) & 0x0000FFFF0000FFFFULL;
2165 f = (
f | (
f << 8U)) & 0x00FF00FF00FF00FFULL;
2166 f = (
f | (
f << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2167 f = (
f | (
f << 2U)) & 0x3333333333333333ULL;
2168 f = (
f | (
f << 1U)) & 0x5555555555555555ULL;
2170 s = (
s | (
s << 16U)) & 0x0000FFFF0000FFFFULL;
2171 s = (
s | (
s << 8U)) & 0x00FF00FF00FF00FFULL;
2172 s = (
s | (
s << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2173 s = (
s | (
s << 2U)) & 0x3333333333333333ULL;
2174 s = (
s | (
s << 1U)) & 0x5555555555555555ULL;
2176 return (
f | (
s << 1U));
2184 template <
typename T>
2196 template <
typename T>
2207 template <
typename T>
2215 template <
typename T,
size_t NBits>
2225 template <
typename T,
size_t NBits>
2229 template <
typename T,
size_t NBits>
2230 ETL_CONSTEXPR
T make_lsb_mask()
2238 template <
typename T>
2239 ETL_CONSTEXPR
T make_lsb_mask(
size_t nbits)
2243 return (
nbits == 0
U) ?
static_cast<T>(0)
2248 template <
typename T,
size_t NBits>
2258 template <
typename T,
size_t NBits>
2262 template <
typename T>
2263 ETL_CONSTEXPR
T make_msb_mask(
size_t nbits)
2267 return (
nbits == 0
U) ?
static_cast<T>(0)
2272 template <
typename T,
size_t NBits>
2273 ETL_CONSTEXPR
T make_msb_mask()
2277 return msb_mask<T, NBits>::value;
2284 template <
typename T>
2290 T operator ()(
T value)
const ETL_NOEXCEPT
2302 template <
typename T>
2315 T operator ()(
T value)
const ETL_NOEXCEPT
2319 return value & parameter;
2331 template <
typename T>
2344 T operator ()(
T value)
const ETL_NOEXCEPT
2348 return value | parameter;
2360 template <
typename T>
2373 T operator ()(
T value)
const ETL_NOEXCEPT
2377 return value ^ parameter;
ETL_CONSTEXPR14 uint_least8_t first_set_bit_position(T value)
Definition binary.h:2068
ETL_CONSTEXPR T binary_merge(T first, T second, T mask)
Definition binary.h:459
binary_constant
Definition binary.h:2390
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:1388
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:542
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:829
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:1027
ETL_CONSTEXPR14 T rotate_left(T value)
Definition binary.h:117
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:2133
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_even(T value)
Definition binary.h:2209
ETL_CONSTEXPR14 uint_least8_t first_clear_bit_position(T value)
Definition binary.h:2079
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:923
ETL_CONSTEXPR14 TReturn fold_bits(TValue value)
Definition binary.h:243
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:1142
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:1874
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:1628
ETL_CONSTEXPR TResult binary_fill()
Definition binary.h:392
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:740
ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
Definition binary.h:272
bit_constant
Definition binary.h:2654
ETL_CONSTEXPR T binary_to_gray(T value)
Definition binary.h:231
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_odd(T value)
Definition binary.h:2198
ETL_CONSTEXPR14 uint_least8_t first_bit_position(bool state, T value)
Definition binary.h:2091
ETL_CONSTEXPR14 T rotate_right(T value)
Definition binary.h:162
Definition for non-zero NBITS.
Definition binary.h:91
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
Definition exception.h:47
Definition integral_limits.h:516
enable_if
Definition type_traits_generator.h:1230
is_integral
Definition type_traits_generator.h:1040
is_signed
Definition type_traits_generator.h:1050
is_unsigned
Definition type_traits_generator.h:1060
make_signed
Definition type_traits_generator.h:1210
make_unsigned
Definition type_traits_generator.h:1220
bitset_ext
Definition absolute.h:38
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314
unary_function
Definition functional.h:151