31#ifndef ETL_BINARY_INCLUDED
32#define ETL_BINARY_INCLUDED
42#include "static_assert.h"
49#if ETL_USING_CPP20 && ETL_USING_STL
63 binary_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
64 :
exception(reason_, file_name_, line_number_)
78 :
etl::binary_exception(ETL_ERROR_TEXT(
"binary:out of range", ETL_BINARY_FILE_ID
"A"), file_name_, line_number_)
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
125 return (value << 1U) | (value >> SHIFT);
133 template <
typename T>
136#if ETL_USING_CPP20 && ETL_USING_STL
143 const size_t SHIFT = BITS - distance;
151 return (value << distance) | (value >> SHIFT);
160 template <
typename T>
163#if ETL_USING_CPP20 && ETL_USING_STL
170 return (value >> 1U) | (value << SHIFT);
178 template <
typename T>
181#if ETL_USING_CPP20 && ETL_USING_STL
188 const size_t SHIFT = BITS - distance;
196 return (value >> distance) | (value << SHIFT);
206 template <
typename T>
207 ETL_CONSTEXPR14 T rotate(T value,
typename etl::make_signed<size_t>::type distance)
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;
250 TReturn folded_value = 0;
255 folded_value ^= value & mask;
260 folded_value ^= value & mask;
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>
320 TReturn mask = TReturn(1) << (NBITS - 1);
321 value = value & TValue((TValue(1) << NBITS) - 1);
323 return TReturn((value ^ mask) - mask);
332 template <
typename TReturn,
typename TValue>
333 ETL_CONSTEXPR14 TReturn
sign_extend(TValue value,
size_t NBITS,
size_t SHIFT)
340 TReturn mask = TReturn(1) << (NBITS - 1);
341 value = (value >> SHIFT) & TValue((TValue(1) << NBITS) - 1);
343 return TReturn((value ^ mask) - mask);
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");
414 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
415 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
417 return TResult(unsigned_v_t(value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
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");
429 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
430 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
432 return TResult(unsigned_v_t(N) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
435#if ETL_USING_8BIT_TYPES
440 template <
typename TValue>
441 ETL_CONSTEXPR14
bool has_zero_byte(TValue value)
443 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
444 ETL_CONSTEXPR14
const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
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()
457 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
458 ETL_CONSTEXPR14
const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
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)
471 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(n)));
478 template <
typename TValue, TValue N>
479 ETL_CONSTEXPR14
bool has_byte_n(TValue value)
481 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(N)));
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>
539 static ETL_CONSTANT uint8_t value1 = uint8_t(((Value & 0xAAU) >> 1U) | ((Value & 0x55U) << 1U));
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>
591 static ETL_CONSTANT uint16_t value1 = uint16_t(((Value & 0xAAAAU) >> 1U) | ((Value & 0x5555U) << 1U));
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>
609 static ETL_CONSTANT int16_t value1 = int16_t(((Value & 0xAAAAU) >> 1U) | ((Value & 0x5555U) << 1U));
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>
645 static ETL_CONSTANT uint32_t value1 = uint32_t(((Value & 0xAAAAAAAAUL) >> 1U) | ((Value & 0x55555555UL) << 1U));
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>
664 static ETL_CONSTANT int32_t value1 = int32_t(((Value & 0xAAAAAAAAUL) >> 1U) | ((Value & 0x55555555UL) << 1U));
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>
747 typedef typename etl::make_unsigned<T>::type unsigned_t;
749 return static_cast<T
>(
reverse_bits(
static_cast<unsigned_t
>(value)));
756#if ETL_USING_8BIT_TYPES
757 template <
typename T>
770 template <
typename T>
775#if ETL_CPP23_SUPPORTED && ETL_USING_STL
778 return (value >> 8U) | (value << 8U);
786 template <
typename T>
791#if ETL_CPP23_SUPPORTED && ETL_USING_STL
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
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>
832 typedef typename etl::make_unsigned<T>::type unsigned_t;
834 return static_cast<T
>(
reverse_bytes(
static_cast<unsigned_t
>(value)));
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>
920 typedef typename etl::make_unsigned<T>::type unsigned_t;
922 return static_cast<T
>(
gray_to_binary(
static_cast<unsigned_t
>(value)));
925#if ETL_USING_8BIT_TYPES
930 template <
typename T>
935#if ETL_CPP23_SUPPORTED && ETL_USING_STL
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
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;
968 return static_cast<uint_least8_t
>(count);
976 template <
typename T>
981#if ETL_USING_CPP20 && ETL_USING_STL
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;
992 return static_cast<uint_least8_t
>(count);
996#if ETL_USING_64BIT_TYPES
1001 template <
typename T>
1006#if ETL_USING_CPP20 && ETL_USING_STL
1009 uint64_t count = 0U;
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;
1018 return static_cast<uint_least8_t
>(count);
1027 template <
typename T>
1032 typedef typename etl::make_unsigned<T>::type unsigned_t;
1034 return static_cast<T
>(
count_bits(
static_cast<unsigned_t
>(value)));
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>
1112 typedef typename etl::make_unsigned<T>::type unsigned_t;
1114 return static_cast<T
>(
parity(
static_cast<unsigned_t
>(value)));
1117#if ETL_USING_8BIT_TYPES
1123 template <
typename T>
1128#if ETL_USING_CPP20 && ETL_USING_STL
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
1180 uint_least8_t count = 0U;
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
1234 uint_least8_t count = 0U;
1244 if ((value & 0xFFFFUL) == 0UL)
1250 if ((value & 0xFFUL) == 0UL)
1256 if ((value & 0xFUL) == 0UL)
1262 if ((value & 0x3UL) == 0UL)
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
1295 uint_least8_t count = 0U;
1305 if ((value & 0xFFFFFFFFULL) == 0ULL)
1311 if ((value & 0xFFFFULL) == 0ULL)
1317 if ((value & 0xFFULL) == 0ULL)
1323 if ((value & 0xFULL) == 0ULL)
1329 if ((value & 0x3ULL) == 0ULL)
1335 if ((value & 0x1U) == 0U)
1341 count -= value & 0x1ULL;
1353 template <
typename T>
1358 typedef typename etl::make_unsigned<T>::type unsigned_t;
1363#if ETL_USING_8BIT_TYPES
1369 template <
typename T>
1374#if ETL_USING_CPP20 && ETL_USING_STL
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
1426 uint_least8_t count = 0U;
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
1480 uint_least8_t count = 0U;
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
1541 uint_least8_t count = 0U;
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>
1598 typedef typename etl::make_unsigned<T>::type unsigned_t;
1603#if ETL_USING_8BIT_TYPES
1609 template <
typename T>
1614#if ETL_USING_CPP20 && ETL_USING_STL
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
1666 uint_least8_t count = 0U;
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
1720 uint_least8_t count = 0U;
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
1781 uint_least8_t count = 0U;
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>
1844 typedef typename etl::make_unsigned<T>::type unsigned_t;
1849#if ETL_USING_8BIT_TYPES
1855 template <
typename T>
1860#if ETL_USING_CPP20 && ETL_USING_STL
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
1912 uint_least8_t count = 0U;
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
1966 uint_least8_t count = 0U;
1968 if ((value & 0x80000000UL) == 0UL)
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) == 0UL);
2013#if ETL_USING_64BIT_TYPES
2019 template <
typename T>
2024#if ETL_USING_CPP20 && ETL_USING_STL
2027 uint_least8_t count = 0U;
2029 if ((value & 0x8000000000000000ULL) == 0ULL)
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) == 0ULL);
2085 template <
typename T>
2090 typedef typename etl::make_unsigned<T>::type unsigned_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>
2129 uint32_t f = uint32_t(first);
2130 uint32_t s = uint32_t(second);
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>
2155 uint64_t f = uint64_t(first);
2156 uint64_t s = uint64_t(second);
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>
2194 return ((
static_cast<typename etl::make_unsigned<T>::type
>(value) & 1U) != 0U);
2201 template <
typename T>
2205 return ((
static_cast<typename etl::make_unsigned<T>::type
>(value) & 1U) == 0U);
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)
2224 typedef typename etl::make_unsigned<T>::type type;
2227 :
static_cast<T
>((
static_cast<type
>(1U) << nbits) - 1U);
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)
Definition: binary.h:2211
Definition: binary.h:2233
ETL_CONSTEXPR TResult binary_fill(TValue value)
Definition: binary.h:410
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_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
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition: exception.h:69
Definition: exception.h:47
Definition: integral_limits.h:468
enable_if
Definition: type_traits_generator.h:1191
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
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if< etl::is_unsigned< T >::value, T >::type rotr(T value, int n) ETL_NOEXCEPT
rotr
Definition: bit.h:228
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if< etl::is_unsigned< T >::value, int >::type countl_one(T value) ETL_NOEXCEPT
countl_one
Definition: bit.h:117
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if< etl::is_unsigned< T >::value, T >::type rotl(T value, int n) ETL_NOEXCEPT
rotl
Definition: bit.h:210
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value, T >::type byteswap(T value) ETL_NOEXCEPT
byteswap
Definition: bit.h:86
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if< etl::is_unsigned< T >::value, int >::type popcount(T value) ETL_NOEXCEPT
popcount
Definition: bit.h:246
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if< etl::is_unsigned< T >::value, int >::type countr_one(T value) ETL_NOEXCEPT
countr_one
Definition: bit.h:139
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if< etl::is_unsigned< T >::value, int >::type countr_zero(T value) ETL_NOEXCEPT
countr_zero
Definition: bit.h:128
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if< etl::is_unsigned< T >::value, int >::type countl_zero(T value) ETL_NOEXCEPT
countl_zero
Definition: bit.h:106