31 #ifndef ETL_BINARY_INCLUDED
32 #define ETL_BINARY_INCLUDED
42 #include "static_assert.h"
62 binary_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
63 :
exception(reason_, file_name_, line_number_)
87 template <const
size_t NBITS>
90 typedef typename etl::smallest_uint_for_bits<NBITS>::type value_type;
91 static const value_type value = (value_type(1) << (NBITS - 1)) |
max_value_for_nbits<NBITS - 1>::value;
98 typedef etl::smallest_uint_for_bits<0>::type value_type;
99 static const value_type value = 0;
102 template <const
size_t NBITS>
105 #if ETL_CPP17_SUPPORTED
106 template <const
size_t NBITS>
114 template <
typename T>
121 return (value << 1) | (value >> SHIFT);
128 template <
typename T>
135 const size_t SHIFT = BITS - distance;
137 return (value << distance) | (value >> SHIFT);
144 template <
typename T>
151 return (value >> 1) | (value << SHIFT);
158 template <
typename T>
165 const size_t SHIFT = BITS - distance;
167 return (value >> distance) | (value << SHIFT);
175 template <
typename T>
176 ETL_CONSTEXPR14 T rotate(T value,
typename etl::make_signed<size_t>::type distance)
198 template <
typename T>
203 return (value >> 1) ^ value;
210 template <
typename TReturn, const
size_t NBITS,
typename TValue>
216 const size_t shift = NBITS;
219 TReturn folded_value = 0;
224 folded_value ^= value & mask;
229 folded_value ^= value & mask;
239 template <
typename TReturn, const
size_t NBITS,
typename TValue>
248 signed value : NBITS;
251 return (s.value = value);
260 template <
typename TReturn, const
size_t NBITS, const
size_t SHIFT,
typename TValue>
270 signed value : NBITS;
273 return (s.value = (value >> SHIFT));
281 template <
typename TReturn,
typename TValue>
282 ETL_CONSTEXPR14 TReturn
sign_extend(TValue value,
const size_t NBITS)
289 TReturn mask = TReturn(1) << (NBITS - 1);
290 value = value & TValue((TValue(1) << NBITS) - 1);
292 return TReturn((value ^ mask) - mask);
301 template <
typename TReturn,
typename TValue>
302 ETL_CONSTEXPR14 TReturn
sign_extend(TValue value,
const size_t NBITS,
const size_t SHIFT)
309 TReturn mask = TReturn(1) << (NBITS - 1);
310 value = (value >> SHIFT) & TValue((TValue(1) << NBITS) - 1);
312 return TReturn((value ^ mask) - mask);
320 template <
typename T>
331 template <
typename T>
343 template <
typename T>
359 template <const
size_t POSITION>
362 typedef typename etl::smallest_uint_for_bits<POSITION + 1>::type value_type;
363 static const value_type value = value_type(1) << POSITION;
366 template <const
size_t POSITION>
369 #if ETL_CPP17_SUPPORTED
370 template <const
size_t POSITION>
378 template <
typename TResult,
typename TValue>
381 ETL_STATIC_ASSERT(
sizeof(TResult) >=
sizeof(TValue),
"Result must be at least as large as the fill value");
383 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
384 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
386 return TResult(unsigned_v_t(value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
393 template <
typename TResult,
typename TValue, const TValue N>
396 ETL_STATIC_ASSERT(
sizeof(TResult) >=
sizeof(TValue),
"Result must be at least as large as the fill value");
398 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
399 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
401 return TResult(unsigned_v_t(N) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
409 template <
typename TValue>
410 ETL_CONSTEXPR14
bool has_zero_byte(
const TValue value)
412 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
413 const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
414 const unsigned_t temp = unsigned_t(~((((unsigned_t(value) & mask) + mask) | unsigned_t(value)) | mask));
423 template <
typename TValue, const TValue N>
424 ETL_CONSTEXPR14
bool has_zero_byte()
426 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
427 const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
428 const unsigned_t temp = unsigned_t(~((((unsigned_t(N) & mask) + mask) | unsigned_t(N)) | mask));
437 template <
typename TValue>
438 ETL_CONSTEXPR14
bool has_byte_n(TValue value, uint8_t n)
440 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(n)));
447 template <
typename TValue, const TValue N>
448 ETL_CONSTEXPR14
bool has_byte_n(TValue value)
450 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(N)));
460 template <
typename T>
461 ETL_CONSTEXPR T
binary_merge(
const T first,
const T second,
const T mask)
463 return second ^ ((second ^ first) & mask);
472 template <
typename T, const T MASK>
475 return second ^ ((second ^ first) & MASK);
483 inline ETL_CONSTEXPR14 uint8_t
reverse_bits(uint8_t value)
485 value = ((value & 0xAA) >> 1) | ((value & 0x55) << 1);
486 value = ((value & 0xCC) >> 2) | ((value & 0x33) << 2);
487 value = (value >> 4) | (value << 4);
492 inline ETL_CONSTEXPR14 int8_t
reverse_bits(int8_t value)
504 value = ((value & 0xAAAA) >> 1) | ((value & 0x5555) << 1);
505 value = ((value & 0xCCCC) >> 2) | ((value & 0x3333) << 2);
506 value = ((value & 0xF0F0) >> 4) | ((value & 0x0F0F) << 4);
507 value = (value >> 8) | (value << 8);
512 inline ETL_CONSTEXPR14 int16_t
reverse_bits(int16_t value)
523 value = ((value & 0xAAAAAAAA) >> 1) | ((value & 0x55555555) << 1);
524 value = ((value & 0xCCCCCCCC) >> 2) | ((value & 0x33333333) << 2);
525 value = ((value & 0xF0F0F0F0) >> 4) | ((value & 0x0F0F0F0F) << 4);
526 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
527 value = (value >> 16) | (value << 16);
532 inline ETL_CONSTEXPR14 int32_t
reverse_bits(int32_t value)
537 #if ETL_USING_64BIT_TYPES
544 value = ((value & 0xAAAAAAAAAAAAAAAA) >> 1) | ((value & 0x5555555555555555) << 1);
545 value = ((value & 0xCCCCCCCCCCCCCCCC) >> 2) | ((value & 0x3333333333333333) << 2);
546 value = ((value & 0xF0F0F0F0F0F0F0F0) >> 4) | ((value & 0x0F0F0F0F0F0F0F0F) << 4);
547 value = ((value & 0xFF00FF00FF00FF00) >> 8) | ((value & 0x00FF00FF00FF00FF) << 8);
548 value = ((value & 0xFFFF0000FFFF0000) >> 16) | ((value & 0x0000FFFF0000FFFF) << 16);
549 value = (value >> 32) | (value << 32);
554 inline ETL_CONSTEXPR14 int64_t
reverse_bits(int64_t value)
582 return (value >> 8) | (value << 8);
596 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
597 value = (value >> 16) | (value << 16);
607 #if ETL_USING_64BIT_TYPES
614 value = ((value & 0xFF00FF00FF00FF00) >> 8) | ((value & 0x00FF00FF00FF00FF) << 8);
615 value = ((value & 0xFFFF0000FFFF0000) >> 16) | ((value & 0x0000FFFF0000FFFF) << 16);
616 value = (value >> 32) | (value << 32);
634 value ^= (value >> 4);
635 value ^= (value >> 2);
636 value ^= (value >> 1);
653 value ^= (value >> 8);
654 value ^= (value >> 4);
655 value ^= (value >> 2);
656 value ^= (value >> 1);
672 value ^= (value >> 16);
673 value ^= (value >> 8);
674 value ^= (value >> 4);
675 value ^= (value >> 2);
676 value ^= (value >> 1);
686 #if ETL_USING_64BIT_TYPES
693 value ^= (value >> 32);
694 value ^= (value >> 16);
695 value ^= (value >> 8);
696 value ^= (value >> 4);
697 value ^= (value >> 2);
698 value ^= (value >> 1);
714 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(uint8_t value)
718 count = value - ((value >> 1) & 0x55);
719 count = ((count >> 2) & 0x33) + (count & 0x33);
720 count = ((count >> 4) + count) & 0x0F;
722 return uint_least8_t(count);
725 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(int8_t value)
736 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(uint16_t value)
740 count = value - ((value >> 1) & 0x5555);
741 count = ((count >> 2) & 0x3333) + (count & 0x3333);
742 count = ((count >> 4) + count) & 0x0F0F;
743 count = ((count >> 8) + count) & 0x00FF;
748 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(int16_t value)
757 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(uint32_t value)
761 count = value - ((value >> 1) & 0x55555555);
762 count = ((count >> 2) & 0x33333333) + (count & 0x33333333);
763 count = ((count >> 4) + count) & 0x0F0F0F0F;
764 count = ((count >> 8) + count) & 0x00FF00FF;
765 count = ((count >> 16) + count) & 0x0000FF;
767 return uint_least8_t(count);
770 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(int32_t value)
775 #if ETL_USING_64BIT_TYPES
780 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(uint64_t value)
784 count = value - ((value >> 1) & 0x5555555555555555);
785 count = ((count >> 2) & 0x3333333333333333) + (count & 0x3333333333333333);
786 count = ((count >> 4) + count) & 0x0F0F0F0F0F0F0F0F;
787 count = ((count >> 8) + count) & 0x00FF00FF00FF00FF;
788 count = ((count >> 16) + count) & 0x0000FFFF0000FFFF;
789 count = ((count >> 32) + count) & 0x00000000FFFFFFFF;
791 return uint_least8_t(count);
794 inline ETL_CONSTEXPR14 uint_least8_t
count_bits(int64_t value)
805 inline ETL_CONSTEXPR14 uint_least8_t
parity(uint8_t value)
809 return (0x6996 >> value) & 1;
812 inline ETL_CONSTEXPR14 uint_least8_t
parity(int8_t value)
814 return parity(uint8_t(value));
822 inline ETL_CONSTEXPR14 uint_least8_t
parity(uint16_t value)
827 return (0x6996 >> value) & 1;
830 inline ETL_CONSTEXPR14 uint_least8_t
parity(int16_t value)
832 return parity(uint16_t(value));
839 inline ETL_CONSTEXPR14 uint_least8_t
parity(uint32_t value)
841 value ^= value >> 16;
845 return (0x6996 >> value) & 1;
848 inline ETL_CONSTEXPR14 uint_least8_t
parity(int32_t value)
850 return parity(uint32_t(value));
853 #if ETL_USING_64BIT_TYPES
858 inline ETL_CONSTEXPR14 uint_least8_t
parity(uint64_t value)
860 value ^= value >> 32;
861 value ^= value >> 16;
865 return (0x69966996 >> value) & 1;
868 inline ETL_CONSTEXPR14 uint_least8_t
parity(int64_t value)
870 return parity(uint64_t(value));
882 uint_least8_t count = 0U;
892 if ((value & 0xF) == 0)
898 if ((value & 0x3) == 0)
904 count -= value & 0x1;
923 uint_least8_t count = 0U;
933 if ((value & 0xFF) == 0)
939 if ((value & 0xF) == 0)
945 if ((value & 0x3) == 0)
951 count -= value & 0x1;
969 uint_least8_t count = 0U;
979 if ((value & 0xFFFF) == 0)
985 if ((value & 0xFF) == 0)
991 if ((value & 0xF) == 0)
997 if ((value & 0x3) == 0)
1003 count -= value & 0x1;
1014 #if ETL_USING_64BIT_TYPES
1022 uint_least8_t count = 0U;
1032 if ((value & 0xFFFFFFFF) == 0)
1038 if ((value & 0xFFFF) == 0)
1044 if ((value & 0xFF) == 0)
1050 if ((value & 0xF) == 0)
1056 if ((value & 0x3) == 0)
1062 count -= value & 0x1;
1074 #if ETL_8BIT_SUPPORT
1079 inline ETL_CONSTEXPR14 uint16_t
binary_interleave(uint8_t first, uint8_t second)
1082 uint16_t s = second;
1084 f = (f | (f << 4)) & 0x0F0F;
1085 f = (f | (f << 2)) & 0x3333;
1086 f = (f | (f << 1)) & 0x5555;
1088 s = (s | (s << 4)) & 0x0F0F;
1089 s = (s | (s << 2)) & 0x3333;
1090 s = (s | (s << 1)) & 0x5555;
1092 return (f | (s << 1));
1108 uint32_t s = second;
1110 f = (f | (f << 8)) & 0x00FF00FF;
1111 f = (f | (f << 4)) & 0x0F0F0F0F;
1112 f = (f | (f << 2)) & 0x33333333;
1113 f = (f | (f << 1)) & 0x55555555;
1115 s = (s | (s << 8)) & 0x00FF00FF;
1116 s = (s | (s << 4)) & 0x0F0F0F0F;
1117 s = (s | (s << 2)) & 0x33333333;
1118 s = (s | (s << 1)) & 0x55555555;
1120 return (f | (s << 1));
1128 #if ETL_USING_64BIT_TYPES
1136 uint64_t s = second;
1138 f = (f | (f << 16)) & 0x0000FFFF0000FFFF;
1139 f = (f | (f << 8)) & 0x00FF00FF00FF00FF;
1140 f = (f | (f << 4)) & 0x0F0F0F0F0F0F0F0F;
1141 f = (f | (f << 2)) & 0x3333333333333333;
1142 f = (f | (f << 1)) & 0x5555555555555555;
1144 s = (s | (s << 16)) & 0x0000FFFF0000FFFF;
1145 s = (s | (s << 8)) & 0x00FF00FF00FF00FF;
1146 s = (s | (s << 4)) & 0x0F0F0F0F0F0F0F0F;
1147 s = (s | (s << 2)) & 0x3333333333333333;
1148 s = (s | (s << 1)) & 0x5555555555555555;
1150 return (f | (s << 1));
1163 template <
typename T>
1167 return ((
static_cast<typename etl::make_unsigned<T>::type
>(value) & 1U) != 0U);
1174 template <
typename T>
1178 return ((
static_cast<typename etl::make_unsigned<T>::type
>(value) & 1U) == 0U);
ETL_CONSTEXPR14 uint_least8_t count_bits(uint16_t value)
Definition: binary.h:736
ETL_CONSTEXPR TResult binary_fill(TValue value)
Definition: binary.h:379
ETL_CONSTEXPR14 uint_least8_t first_set_bit_position(T value)
Definition: binary.h:321
ETL_CONSTEXPR uint16_t reverse_bytes(uint16_t value)
Definition: binary.h:580
binary_constant
Definition: binary.h:1186
ETL_CONSTEXPR14 uint32_t binary_interleave(uint16_t first, uint16_t second)
Definition: binary.h:1105
ETL_CONSTEXPR14 uint16_t gray_to_binary(uint16_t value)
Definition: binary.h:651
ETL_CONSTEXPR14 T rotate_left(T value)
Definition: binary.h:115
ETL_CONSTEXPR14 uint_least8_t first_clear_bit_position(T value)
Definition: binary.h:332
ETL_CONSTEXPR14 TReturn fold_bits(TValue value)
Definition: binary.h:211
ETL_CONSTEXPR14 uint_least8_t parity(uint16_t value)
Definition: binary.h:822
ETL_CONSTEXPR T binary_merge(const T first, const T second, const T mask)
Definition: binary.h:461
ETL_CONSTEXPR14 uint_least8_t count_trailing_zeros(uint16_t value)
Definition: binary.h:921
ETL_CONSTEXPR14 uint16_t reverse_bits(uint16_t value)
Definition: binary.h:502
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_odd(const T value)
Definition: binary.h:1165
ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
Definition: binary.h:240
bit_constant
Definition: binary.h:1451
ETL_CONSTEXPR T binary_to_gray(T value)
Definition: binary.h:199
ETL_CONSTEXPR14 uint_least8_t first_bit_position(bool state, T value)
Definition: binary.h:344
ETL_CONSTEXPR14 T rotate_right(T value)
Definition: binary.h:145
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_even(const T value)
Definition: binary.h:1176
Definition for non-zero NBITS.
Definition: binary.h:89
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
exception(string_type reason_, string_type file_, numeric_type line_)
Constructor.
Definition: exception.h:67
Definition: exception.h:47
Definition: integral_limits.h:54
enable_if
Definition: type_traits_generator.h:1228
is_integral
Definition: type_traits_generator.h:941
Definition: absolute.h:37