Embedded Template Library 1.0
Loading...
Searching...
No Matches
binary.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2015 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_BINARY_INCLUDED
32#define ETL_BINARY_INCLUDED
33
37
38#include "platform.h"
39#include "type_traits.h"
40#include "integral_limits.h"
41#include "limits.h"
42#include "static_assert.h"
43#include "log.h"
44#include "power.h"
45#include "smallest.h"
46#include "exception.h"
47#include "error_handler.h"
48#include "functional.h"
49
50#if ETL_USING_CPP20 && ETL_USING_STL
51 #include <bit>
52#endif
53
54namespace etl
55{
56 //***************************************************************************
59 //***************************************************************************
60 class binary_exception : public etl::exception
61 {
62 public:
63
64 binary_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
65 : exception(reason_, file_name_, line_number_)
66 {
67 }
68 };
69
70 //***************************************************************************
73 //***************************************************************************
74 class binary_out_of_range : public etl::binary_exception
75 {
76 public:
77
78 binary_out_of_range(string_type file_name_, numeric_type line_number_)
79 : etl::binary_exception(ETL_ERROR_TEXT("binary:out of range", ETL_BINARY_FILE_ID"A"), file_name_, line_number_)
80 {
81 }
82 };
83
84 //***************************************************************************
87 //***************************************************************************
89 template <size_t NBits>
91 {
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;
94 };
95
97 template <>
99 {
100 typedef etl::smallest_uint_for_bits<0>::type value_type;
101 static ETL_CONSTANT value_type value = 0;
102 };
103
104 template <size_t NBits>
105 ETL_CONSTANT typename max_value_for_nbits<NBits>::value_type max_value_for_nbits<NBits>::value;
106
107#if ETL_USING_CPP17
108 template <size_t NBits>
109 inline constexpr typename etl::max_value_for_nbits<NBits>::value_type max_value_for_nbits_v = max_value_for_nbits<NBits>::value;
110#endif
111
112 //***************************************************************************
115 //***************************************************************************
116 template <typename T>
117 ETL_CONSTEXPR14 T rotate_left(T value)
118 {
119#if ETL_USING_CPP20 && ETL_USING_STL
120 return std::rotl(value, 1);
121#else
122 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
123
124 ETL_CONSTANT size_t SHIFT = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits - 1U;
125
126 return (value << 1U) | (value >> SHIFT);
127#endif
128 }
129
130 //***************************************************************************
133 //***************************************************************************
134 template <typename T>
135 ETL_CONSTEXPR14 T rotate_left(T value, size_t distance)
136 {
137#if ETL_USING_CPP20 && ETL_USING_STL
138 return std::rotl(value, distance);
139#else
140 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
141
142 ETL_CONSTANT size_t BITS = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits;
143 distance %= BITS;
144 const size_t SHIFT = BITS - distance;
145
146 if (SHIFT == BITS)
147 {
148 return value;
149 }
150 else
151 {
152 return (value << distance) | (value >> SHIFT);
153 }
154#endif
155 }
156
157 //***************************************************************************
160 //***************************************************************************
161 template <typename T>
162 ETL_CONSTEXPR14 T rotate_right(T value)
163 {
164#if ETL_USING_CPP20 && ETL_USING_STL
165 return std::rotr(value, 1);
166#else
167 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
168
169 ETL_CONSTANT size_t SHIFT = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits - 1U;
170
171 return (value >> 1U) | (value << SHIFT);
172#endif
173 }
174
175 //***************************************************************************
178 //***************************************************************************
179 template <typename T>
180 ETL_CONSTEXPR14 T rotate_right(T value, size_t distance)
181 {
182#if ETL_USING_CPP20 && ETL_USING_STL
183 return std::rotr(value, distance);
184#else
185 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
186
187 ETL_CONSTANT size_t BITS = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits;
188 distance %= BITS;
189 const size_t SHIFT = BITS - distance;
190
191 if (SHIFT == BITS)
192 {
193 return value;
194 }
195 else
196 {
197 return (value >> distance) | (value << SHIFT);
198 }
199#endif
200 }
201
202 //***************************************************************************
206 //***************************************************************************
207 template <typename T>
208 ETL_CONSTEXPR14 T rotate(T value, typename etl::make_signed<size_t>::type distance)
209 {
210 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
211
212 T result = T();
213
214 if (distance > 0)
215 {
216 result = rotate_left(value, size_t(distance));
217 }
218 else
219 {
220 result = rotate_right(value, size_t(-distance));
221 }
222
223 return result;
224 }
225
226 //***************************************************************************
229 //***************************************************************************
230 template <typename T>
231 ETL_CONSTEXPR T binary_to_gray(T value)
232 {
233 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
234
235 return (value >> 1U) ^ value;
236 }
237
238 //***************************************************************************
241 //***************************************************************************
242 template <typename TReturn, size_t NBits, typename TValue>
243 ETL_CONSTEXPR14 TReturn fold_bits(TValue value)
244 {
245 ETL_STATIC_ASSERT(integral_limits<TReturn>::bits >= NBits, "Return type too small to hold result");
246
247 ETL_CONSTANT TValue mask = etl::power<2, NBits>::value - 1U;
248 ETL_CONSTANT size_t shift = NBits;
249
250 // Fold the value down to fit the width.
251 TReturn folded_value = 0;
252
253 // Keep shifting down and XORing the lower bits.
254 while (value >= etl::max_value_for_nbits<NBits>::value)
255 {
256 folded_value ^= value & mask;
257 value >>= shift;
258 }
259
260 // Fold the remaining bits.
261 folded_value ^= value & mask;
262
263 return folded_value;
264 }
265
266 //***************************************************************************
270 //***************************************************************************
271 template <typename TReturn, size_t NBits, typename TValue>
272 ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
273 {
274 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value, "TValue not an integral type");
275 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value, "TReturn not an integral type");
276 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<TReturn>::bits, "NBits too large for return type");
277
278 struct S
279 {
280 signed value : NBits;
281 } s = {0};
282
283 return (s.value = value);
284 }
285
286 //***************************************************************************
291 //***************************************************************************
292 template <typename TReturn, size_t NBits, size_t SHIFT, typename TValue>
293 ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
294 {
295 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value, "TValue not an integral type");
296 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value, "TReturn not an integral type");
297 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<TReturn>::bits, "NBits too large for return type");
298 ETL_STATIC_ASSERT(SHIFT <= etl::integral_limits<TReturn>::bits, "SHIFT too large");
299
300 struct S
301 {
302 signed value : NBits;
303 } s = {0};
304
305 return (s.value = (value >> SHIFT));
306 }
307
308 //***************************************************************************
312 //***************************************************************************
313 template <typename TReturn, typename TValue>
314 ETL_CONSTEXPR14 TReturn sign_extend(TValue value, size_t NBits)
315 {
316 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value, "TValue not an integral type");
317 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value, "TReturn not an integral type");
318
320
321 TReturn mask = TReturn(1) << (NBits - 1);
322 value = value & TValue((TValue(1) << NBits) - 1);
323
324 return TReturn((value ^ mask) - mask);
325 }
326
327 //***************************************************************************
332 //***************************************************************************
333 template <typename TReturn, typename TValue>
334 ETL_CONSTEXPR14 TReturn sign_extend(TValue value, size_t NBits, size_t SHIFT)
335 {
336 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value, "TValue not an integral type");
337 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value, "TReturn not an integral type");
338
340
341 TReturn mask = TReturn(1) << (NBits - 1);
342 value = (value >> SHIFT) & TValue((TValue(1) << NBits) - 1);
343
344 return TReturn((value ^ mask) - mask);
345 }
346
347 //***************************************************************************
351 //***************************************************************************
352 template <size_t POSITION>
353 struct bit
354 {
355 typedef typename etl::smallest_uint_for_bits<POSITION + 1U>::type value_type;
356 static ETL_CONSTANT value_type value = value_type(1) << POSITION;
357 };
358
359 template <size_t POSITION>
360 ETL_CONSTANT typename bit<POSITION>::value_type bit<POSITION>::value;
361
362#if ETL_USING_CPP11
363 template <size_t POSITION>
364 using bit_t = typename etl::bit<POSITION>::value_type;
365#endif
366
367#if ETL_USING_CPP17
368 template <size_t POSITION>
369 inline constexpr bit_t<POSITION> bit_v = etl::bit<POSITION>::value;
370#endif
371
372 //***************************************************************************
375 //***************************************************************************
376 template <typename TResult, typename TValue>
377 ETL_CONSTEXPR TResult binary_fill(TValue value)
378 {
379 ETL_STATIC_ASSERT(sizeof(TResult) >= sizeof(TValue), "Result must be at least as large as the fill value");
380
381 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
382 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
383
384 return TResult(unsigned_v_t(value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
385 }
386
387 //***************************************************************************
390 //***************************************************************************
391 template <typename TResult, typename TValue, TValue Value>
392 ETL_CONSTEXPR TResult binary_fill()
393 {
394 ETL_STATIC_ASSERT(sizeof(TResult) >= sizeof(TValue), "Result must be at least as large as the fill value");
395
396 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
397 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
398
399 return TResult(unsigned_v_t(Value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
400 }
401
402#if ETL_USING_8BIT_TYPES
403 //***************************************************************************
406 //***************************************************************************
407 template <typename TValue>
408 ETL_CONSTEXPR14 bool has_zero_byte(TValue value)
409 {
410 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
411 ETL_CONSTEXPR14 const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
412 const unsigned_t temp = unsigned_t(~((((unsigned_t(value) & mask) + mask) | unsigned_t(value)) | mask));
413
414 return (temp != 0U);
415 }
416
417 //***************************************************************************
420 //***************************************************************************
421 template <typename TValue, TValue Value>
422 ETL_CONSTEXPR14 bool has_zero_byte()
423 {
424 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
425 ETL_CONSTEXPR14 const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
426 const unsigned_t temp = unsigned_t(~((((unsigned_t(Value) & mask) + mask) | unsigned_t(Value)) | mask));
427
428 return (temp != 0U);
429 }
430
431 //***************************************************************************
434 //***************************************************************************
435 template <typename TValue>
436 ETL_CONSTEXPR14 bool has_byte_n(TValue value, uint8_t n)
437 {
438 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(n)));
439 }
440
441 //***************************************************************************
444 //***************************************************************************
445 template <typename TValue, TValue Value>
446 ETL_CONSTEXPR14 bool has_byte_n(TValue value)
447 {
448 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(Value)));
449 }
450#endif
451
452 //***************************************************************************
457 //***************************************************************************
458 template <typename T>
459 ETL_CONSTEXPR T binary_merge(T first, T second, T mask)
460 {
461 return second ^ ((second ^ first) & mask);
462 }
463
464 //***************************************************************************
469 //***************************************************************************
470 template <typename T, T MASK>
471 ETL_CONSTEXPR T binary_merge(T first, T second)
472 {
473 return second ^ ((second ^ first) & MASK);
474 }
475
476 //***************************************************************************
479 //***************************************************************************
480 template <typename T, T Value>
482
483#if ETL_USING_8BIT_TYPES
484 //***************************************************************************
487 //***************************************************************************
488 template <typename T>
489 ETL_CONSTEXPR14
491 reverse_bits(T value)
492 {
493 value = ((value & 0xAAU) >> 1U) | ((value & 0x55U) << 1U);
494 value = ((value & 0xCCU) >> 2U) | ((value & 0x33U) << 2U);
495 value = (value >> 4U) | ((value & 0x0FU) << 4U);
496
497 return value;
498 }
499
500 //***********************************
501 template <uint8_t Value>
502 struct reverse_bits_const<uint8_t, Value>
503 {
504 private:
505
506 static ETL_CONSTANT uint8_t value1 = uint8_t(((Value & 0xAAU) >> 1U) | ((Value & 0x55U) << 1U));
507 static ETL_CONSTANT uint8_t value2 = uint8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
508
509 public:
510
511 static ETL_CONSTANT uint8_t value = uint8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
512 };
513
514 template <uint8_t Value>
515 ETL_CONSTANT uint8_t reverse_bits_const<uint8_t, Value>::value;
516
517 //***********************************
518 template <int8_t Value>
519 struct reverse_bits_const<int8_t, Value>
520 {
521 private:
522
523 static ETL_CONSTANT int8_t value1 = int8_t(((Value & 0xAAU) >> 1U) | ((Value & 0x55U) << 1U));
524 static ETL_CONSTANT int8_t value2 = int8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
525
526 public:
527
528 static ETL_CONSTANT int8_t value = int8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
529 };
530
531 template <int8_t Value>
533#endif
534
535 //***************************************************************************
538 //***************************************************************************
539 template <typename T>
540 ETL_CONSTEXPR14
541 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
543 {
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);
548
549 return value;
550 }
551
552 //***********************************
553 template <uint16_t Value>
554 struct reverse_bits_const<uint16_t, Value>
555 {
556 private:
557
558 static ETL_CONSTANT uint16_t value1 = uint16_t(((Value & 0xAAAAU) >> 1U) | ((Value & 0x5555U) << 1U));
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));
561
562 public:
563
564 static ETL_CONSTANT uint16_t value = uint16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
565 };
566
567 template <uint16_t Value>
568 ETL_CONSTANT uint16_t reverse_bits_const<uint16_t, Value>::value;
569
570 //***********************************
571 template <int16_t Value>
572 struct reverse_bits_const<int16_t, Value>
573 {
574 private:
575
576 static ETL_CONSTANT int16_t value1 = int16_t(((Value & 0xAAAAU) >> 1U) | ((Value & 0x5555U) << 1U));
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));
579
580 public:
581
582 static ETL_CONSTANT int16_t value = int16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
583 };
584
585 template <int16_t Value>
587
588 //***************************************************************************
591 //***************************************************************************
592 template <typename T>
593 ETL_CONSTEXPR14
596 {
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);
602
603 return value;
604 }
605
606 //***********************************
607 template <uint32_t Value>
608 struct reverse_bits_const<uint32_t, Value>
609 {
610 private:
611
612 static ETL_CONSTANT uint32_t value1 = uint32_t(((Value & 0xAAAAAAAAUL) >> 1U) | ((Value & 0x55555555UL) << 1U));
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));
616
617 public:
618
619 static ETL_CONSTANT uint32_t value = uint32_t((value4 >> 16U) | ((value4 & 0xFFFFU) << 16U));
620 };
621
622 template <uint32_t Value>
623 ETL_CONSTANT uint32_t reverse_bits_const<uint32_t, Value>::value;
624
625 //***********************************
626 template <int32_t Value>
627 struct reverse_bits_const<int32_t, Value>
628 {
629 private:
630
631 static ETL_CONSTANT int32_t value1 = int32_t(((Value & 0xAAAAAAAAUL) >> 1U) | ((Value & 0x55555555UL) << 1U));
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));
635
636 public:
637
638 static ETL_CONSTANT int32_t value = int32_t((value4 >> 16U) | ((value4 & 0xFFFFUL) << 16U));
639 };
640
641 template <int32_t Value>
643
644#if ETL_USING_64BIT_TYPES
645 //***************************************************************************
648 //***************************************************************************
649 template <typename T>
650 ETL_CONSTEXPR14
653 {
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);
660
661 return value;
662 }
663
664 //***********************************
665 template <uint64_t Value>
666 struct reverse_bits_const<uint64_t, Value>
667 {
668 private:
669
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));
675
676 public:
677
678 static ETL_CONSTANT uint64_t value = uint64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
679 };
680
681 template <uint64_t Value>
682 ETL_CONSTANT uint64_t reverse_bits_const<uint64_t, Value>::value;
683
684 //***********************************
685 template <int64_t Value>
686 struct reverse_bits_const<int64_t, Value>
687 {
688 private:
689
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));
695
696 public:
697
698 static ETL_CONSTANT int64_t value = int64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
699 };
700
701 template <int64_t Value>
703#endif
704
705 //***************************************************************************
708 //***************************************************************************
709 template <typename T>
710 ETL_CONSTEXPR14
711 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, T>::type
713 {
714 typedef typename etl::make_unsigned<T>::type unsigned_t;
715
716 return static_cast<T>(reverse_bits(static_cast<unsigned_t>(value)));
717 }
718
719 //***************************************************************************
722 //***************************************************************************
723#if ETL_USING_8BIT_TYPES
724 template <typename T>
725 ETL_CONSTEXPR14
727 reverse_bytes(T value)
728 {
729 return value;
730 }
731#endif
732
733 //***************************************************************************
736 //***************************************************************************
737 template <typename T>
738 ETL_CONSTEXPR14
739 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
741 {
742#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
743 return std::byteswap(value);
744#else
745 return (value >> 8U) | (value << 8U);
746#endif
747 }
748
749 //***************************************************************************
752 //***************************************************************************
753 template <typename T>
754 ETL_CONSTEXPR14
757 {
758#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
759 return std::byteswap(value);
760#else
761 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
762 value = (value >> 16U) | (value << 16U);
763
764 return value;
765#endif
766 }
767
768#if ETL_USING_64BIT_TYPES
769 //***************************************************************************
772 //***************************************************************************
773 template <typename T>
774 ETL_CONSTEXPR14
777 {
778#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
779 return std::byteswap(value);
780#else
781 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
782 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
783 value = (value >> 32U) | (value << 32U);
784
785 return value;
786#endif
787 }
788#endif
789
790 //***************************************************************************
793 //***************************************************************************
794 template <typename T>
795 ETL_CONSTEXPR14
796 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, T>::type
798 {
799 typedef typename etl::make_unsigned<T>::type unsigned_t;
800
801 return static_cast<T>(reverse_bytes(static_cast<unsigned_t>(value)));
802 }
803
804#if ETL_USING_8BIT_TYPES
805 //***************************************************************************
808 //***************************************************************************
809 template <typename T>
810 ETL_CONSTEXPR14
812 gray_to_binary(T value)
813 {
814 value ^= (value >> 4U);
815 value ^= (value >> 2U);
816 value ^= (value >> 1U);
817
818 return value;
819 }
820#endif
821
822 //***************************************************************************
825 //***************************************************************************
826 template <typename T>
827 ETL_CONSTEXPR14
828 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
830 {
831 value ^= (value >> 8U);
832 value ^= (value >> 4U);
833 value ^= (value >> 2U);
834 value ^= (value >> 1U);
835
836 return value;
837 }
838
839 //***************************************************************************
842 //***************************************************************************
843 template <typename T>
844 ETL_CONSTEXPR14
847 {
848 value ^= (value >> 16U);
849 value ^= (value >> 8U);
850 value ^= (value >> 4U);
851 value ^= (value >> 2U);
852 value ^= (value >> 1U);
853
854 return value;
855 }
856
857#if ETL_USING_64BIT_TYPES
858 //***************************************************************************
861 //***************************************************************************
862 template <typename T>
863 ETL_CONSTEXPR14
866 {
867 value ^= (value >> 32U);
868 value ^= (value >> 16U);
869 value ^= (value >> 8U);
870 value ^= (value >> 4U);
871 value ^= (value >> 2U);
872 value ^= (value >> 1U);
873
874 return value;
875 }
876#endif
877
878 //***************************************************************************
881 //***************************************************************************
882 template <typename T>
883 ETL_CONSTEXPR14
884 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, T>::type
886 {
887 typedef typename etl::make_unsigned<T>::type unsigned_t;
888
889 return static_cast<T>(gray_to_binary(static_cast<unsigned_t>(value)));
890 }
891
892#if ETL_USING_8BIT_TYPES
893 //***************************************************************************
896 //***************************************************************************
897 template <typename T>
898 ETL_CONSTEXPR14
900 count_bits(T value)
901 {
902#if ETL_CPP23_SUPPORTED && ETL_USING_STL
903 return std::popcount(value);
904#else
905 uint32_t count = 0U;
906
907 count = value - ((value >> 1U) & 0x55U);
908 count = ((count >> 2U) & 0x33U) + (count & 0x33U);
909 count = ((count >> 4U) + count) & 0x0FU;
910
911 return uint_least8_t(count);
912#endif
913 }
914#endif
915
916 //***************************************************************************
919 //***************************************************************************
920 template <typename T>
921 ETL_CONSTEXPR14
922 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
923 count_bits(T value)
924 {
925#if ETL_USING_CPP20 && ETL_USING_STL
926 return std::popcount(value);
927#else
928 uint32_t count = 0U;
929
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;
934
935 return static_cast<uint_least8_t>(count);
936#endif
937 }
938
939 //***************************************************************************
942 //***************************************************************************
943 template <typename T>
944 ETL_CONSTEXPR14
946 count_bits(T value)
947 {
948#if ETL_USING_CPP20 && ETL_USING_STL
949 return std::popcount(value);
950#else
951 uint32_t count = 0U;
952
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;
958
959 return static_cast<uint_least8_t>(count);
960#endif
961 }
962
963#if ETL_USING_64BIT_TYPES
964 //***************************************************************************
967 //***************************************************************************
968 template <typename T>
969 ETL_CONSTEXPR14
971 count_bits(T value)
972 {
973#if ETL_USING_CPP20 && ETL_USING_STL
974 return std::popcount(value);
975#else
976 uint64_t count = 0U;
977
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;
984
985 return static_cast<uint_least8_t>(count);
986#endif
987 }
988#endif
989
990 //***************************************************************************
993 //***************************************************************************
994 template <typename T>
995 ETL_CONSTEXPR14
996 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>::type
997 count_bits(T value)
998 {
999 typedef typename etl::make_unsigned<T>::type unsigned_t;
1000
1001 return static_cast<T>(count_bits(static_cast<unsigned_t>(value)));
1002 }
1003
1004#if ETL_USING_8BIT_TYPES
1005 //***************************************************************************
1008 //***************************************************************************
1009 template <typename T>
1010 ETL_CONSTEXPR14
1012 parity(T value)
1013 {
1014 value ^= value >> 4U;
1015 value &= 0x0FU;
1016 return (0x6996U >> value) & 1U;
1017 }
1018#endif
1019
1020 //***************************************************************************
1023 //***************************************************************************
1024 template <typename T>
1025 ETL_CONSTEXPR14
1026 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1027 parity(T value)
1028 {
1029 value ^= value >> 8U;
1030 value ^= value >> 4U;
1031 value &= 0x0FU;
1032 return (0x6996U >> value) & 1U;
1033 }
1034
1035 //***************************************************************************
1038 //***************************************************************************
1039 template <typename T>
1040 ETL_CONSTEXPR14
1042 parity(T value)
1043 {
1044 value ^= value >> 16U;
1045 value ^= value >> 8U;
1046 value ^= value >> 4U;
1047 value &= 0x0FU;
1048 return (0x6996U >> value) & 1U;
1049 }
1050
1051#if ETL_USING_64BIT_TYPES
1052 //***************************************************************************
1055 //***************************************************************************
1056 template <typename T>
1057 ETL_CONSTEXPR14
1059 parity(T value)
1060 {
1061 value ^= value >> 32U;
1062 value ^= value >> 16U;
1063 value ^= value >> 8U;
1064 value ^= value >> 4U;
1065 value &= 0x0FU;
1066 return (0x69966996UL >> value) & 1U;
1067 }
1068#endif
1069
1070 //***************************************************************************
1073 //***************************************************************************
1074 template <typename T>
1075 ETL_CONSTEXPR14
1076 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>::type
1077 parity(T value)
1078 {
1079 typedef typename etl::make_unsigned<T>::type unsigned_t;
1080
1081 return static_cast<T>(parity(static_cast<unsigned_t>(value)));
1082 }
1083
1084#if ETL_USING_8BIT_TYPES
1085 //***************************************************************************
1089 //***************************************************************************
1090 template <typename T>
1091 ETL_CONSTEXPR14
1093 count_trailing_zeros(T value)
1094 {
1095#if ETL_USING_CPP20 && ETL_USING_STL
1096 return std::countr_zero(value);
1097#else
1098 uint_least8_t count = 0U;
1099
1100 if (value & 0x1U)
1101 {
1102 count = 0U;
1103 }
1104 else
1105 {
1106 count = 1U;
1107
1108 if ((value & 0xFU) == 0U)
1109 {
1110 value >>= 4U;
1111 count += 4U;
1112 }
1113
1114 if ((value & 0x3U) == 0U)
1115 {
1116 value >>= 2U;
1117 count += 2U;
1118 }
1119
1120 if ((value & 0x1U) == 0U)
1121 {
1122 value >>= 1U;
1123 count += 1U;
1124 }
1125
1126 count -= (value & 0x1U);
1127 }
1128
1129 return count;
1130#endif
1131 }
1132#endif
1133
1134 //***************************************************************************
1138 //***************************************************************************
1139 template <typename T>
1140 ETL_CONSTEXPR14
1141 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1143 {
1144#if ETL_USING_CPP20 && ETL_USING_STL
1145 return std::countr_zero(value);
1146#else
1147 uint_least8_t count = 0U;
1148
1149 if (value & 0x1U)
1150 {
1151 count = 0U;
1152 }
1153 else
1154 {
1155 count = 1U;
1156
1157 if ((value & 0xFFU) == 0U)
1158 {
1159 value >>= 8U;
1160 count += 8U;
1161 }
1162
1163 if ((value & 0xFU) == 0U)
1164 {
1165 value >>= 4U;
1166 count += 4U;
1167 }
1168
1169 if ((value & 0x3U) == 0U)
1170 {
1171 value >>= 2U;
1172 count += 2U;
1173 }
1174
1175 if ((value & 0x1U) == 0U)
1176 {
1177 value >>= 1U;
1178 count += 1U;
1179 }
1180
1181 count -= value & 0x1U;
1182 }
1183
1184 return count;
1185#endif
1186 }
1187
1188 //***************************************************************************
1192 //***************************************************************************
1193 template <typename T>
1194 ETL_CONSTEXPR14
1197 {
1198#if ETL_USING_CPP20 && ETL_USING_STL
1199 return std::countr_zero(value);
1200#else
1201 uint_least8_t count = 0U;
1202
1203 if (value & 0x1UL)
1204 {
1205 count = 0U;
1206 }
1207 else
1208 {
1209 count = 1U;
1210
1211 if ((value & 0xFFFFUL) == 0UL)
1212 {
1213 value >>= 16U;
1214 count += 16U;
1215 }
1216
1217 if ((value & 0xFFUL) == 0UL)
1218 {
1219 value >>= 8U;
1220 count += 8U;
1221 }
1222
1223 if ((value & 0xFUL) == 0UL)
1224 {
1225 value >>= 4U;
1226 count += 4U;
1227 }
1228
1229 if ((value & 0x3UL) == 0UL)
1230 {
1231 value >>= 2U;
1232 count += 2U;
1233 }
1234
1235 if ((value & 0x1U) == 0U)
1236 {
1237 value >>= 1U;
1238 count += 1U;
1239 }
1240
1241 count -= value & 0x1UL;
1242 }
1243
1244 return count;
1245#endif
1246 }
1247
1248#if ETL_USING_64BIT_TYPES
1249 //***************************************************************************
1253 //***************************************************************************
1254 template <typename T>
1255 ETL_CONSTEXPR14
1258 {
1259#if ETL_USING_CPP20 && ETL_USING_STL
1260 return std::countr_zero(value);
1261#else
1262 uint_least8_t count = 0U;
1263
1264 if (value & 0x1ULL)
1265 {
1266 count = 0U;
1267 }
1268 else
1269 {
1270 count = 1U;
1271
1272 if ((value & 0xFFFFFFFFULL) == 0ULL)
1273 {
1274 value >>= 32U;
1275 count += 32U;
1276 }
1277
1278 if ((value & 0xFFFFULL) == 0ULL)
1279 {
1280 value >>= 16U;
1281 count += 16U;
1282 }
1283
1284 if ((value & 0xFFULL) == 0ULL)
1285 {
1286 value >>= 8U;
1287 count += 8U;
1288 }
1289
1290 if ((value & 0xFULL) == 0ULL)
1291 {
1292 value >>= 4U;
1293 count += 4U;
1294 }
1295
1296 if ((value & 0x3ULL) == 0ULL)
1297 {
1298 value >>= 2U;
1299 count += 2U;
1300 }
1301
1302 if ((value & 0x1U) == 0U)
1303 {
1304 value >>= 1U;
1305 count += 1U;
1306 }
1307
1308 count -= value & 0x1ULL;
1309 }
1310
1311 return count;
1312#endif
1313 }
1314#endif
1315
1316 //***************************************************************************
1319 //***************************************************************************
1320 template <typename T>
1321 ETL_CONSTEXPR14
1322 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>::type
1324 {
1325 typedef typename etl::make_unsigned<T>::type unsigned_t;
1326
1327 return static_cast<T>(count_trailing_zeros(static_cast<unsigned_t>(value)));
1328 }
1329
1330#if ETL_USING_8BIT_TYPES
1331 //***************************************************************************
1335 //***************************************************************************
1336 template <typename T>
1337 ETL_CONSTEXPR14
1339 count_trailing_ones(T value)
1340 {
1341#if ETL_USING_CPP20 && ETL_USING_STL
1342 return std::countr_one(value);
1343#else
1344 uint_least8_t count = 0U;
1345
1346 if ((value & 0x1U) == 0x0U)
1347 {
1348 count = 0U;
1349 }
1350 else
1351 {
1352 count = 1U;
1353
1354 if ((value & 0xFU) == 0xFU)
1355 {
1356 value >>= 4U;
1357 count += 4U;
1358 }
1359
1360 if ((value & 0x3U) == 0x3U)
1361 {
1362 value >>= 2U;
1363 count += 2U;
1364 }
1365
1366 if ((value & 0x1U) == 0x1U)
1367 {
1368 value >>= 1U;
1369 count += 1U;
1370 }
1371
1372 count -= ((value & 0x1U) == 0x0U);
1373 }
1374
1375 return count;
1376#endif
1377 }
1378#endif
1379
1380 //***************************************************************************
1384 //***************************************************************************
1385 template <typename T>
1386 ETL_CONSTEXPR14
1387 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1389 {
1390#if ETL_USING_CPP20 && ETL_USING_STL
1391 return std::countr_one(value);
1392#else
1393 uint_least8_t count = 0U;
1394
1395 if ((value & 0x1U) == 0x0U)
1396 {
1397 count = 0U;
1398 }
1399 else
1400 {
1401 count = 1U;
1402
1403 if ((value & 0xFFU) == 0xFFU)
1404 {
1405 value >>= 8U;
1406 count += 8U;
1407 }
1408
1409 if ((value & 0xFU) == 0xFU)
1410 {
1411 value >>= 4U;
1412 count += 4U;
1413 }
1414
1415 if ((value & 0x3U) == 0x3U)
1416 {
1417 value >>= 2U;
1418 count += 2U;
1419 }
1420
1421 if ((value & 0x1U) == 0x1U)
1422 {
1423 value >>= 1U;
1424 count += 1U;
1425 }
1426
1427 count -= ((value & 0x1U) == 0x0U);
1428 }
1429
1430 return count;
1431#endif
1432 }
1433
1434 //***************************************************************************
1438 //***************************************************************************
1439 template <typename T>
1440 ETL_CONSTEXPR14
1443 {
1444#if ETL_USING_CPP20 && ETL_USING_STL
1445 return std::countr_one(value);
1446#else
1447 uint_least8_t count = 0U;
1448
1449 if ((value & 0x1UL) == 0x0UL)
1450 {
1451 count = 0U;
1452 }
1453 else
1454 {
1455 count = 1U;
1456
1457 if ((value & 0xFFFFUL) == 0xFFFFUL)
1458 {
1459 value >>= 16U;
1460 count += 16U;
1461 }
1462
1463 if ((value & 0xFFUL) == 0xFFUL)
1464 {
1465 value >>= 8U;
1466 count += 8U;
1467 }
1468
1469 if ((value & 0xFUL) == 0xFUL)
1470 {
1471 value >>= 4U;
1472 count += 4U;
1473 }
1474
1475 if ((value & 0x3UL) == 0x3UL)
1476 {
1477 value >>= 2U;
1478 count += 2U;
1479 }
1480
1481 if ((value & 0x1UL) == 0x1UL)
1482 {
1483 value >>= 1U;
1484 count += 1U;
1485 }
1486
1487 count -= ((value & 0x1UL) == 0x0UL);
1488 }
1489
1490 return count;
1491#endif
1492 }
1493
1494#if ETL_USING_64BIT_TYPES
1495 //***************************************************************************
1499 //***************************************************************************
1500 template <typename T>
1501 ETL_CONSTEXPR14
1504 {
1505#if ETL_USING_CPP20 && ETL_USING_STL
1506 return std::countr_one(value);
1507#else
1508 uint_least8_t count = 0U;
1509
1510 if ((value & 0x1ULL) == 0x0ULL)
1511 {
1512 count = 0U;
1513 }
1514 else
1515 {
1516 count = 1U;
1517
1518 if ((value & 0xFFFFULL) == 0xFFFFULL)
1519 {
1520 value >>= 16U;
1521 count += 16U;
1522 }
1523
1524 if ((value & 0xFFULL) == 0xFFULL)
1525 {
1526 value >>= 8U;
1527 count += 8U;
1528 }
1529
1530 if ((value & 0xFULL) == 0xFULL)
1531 {
1532 value >>= 4U;
1533 count += 4U;
1534 }
1535
1536 if ((value & 0x3ULL) == 0x3ULL)
1537 {
1538 value >>= 2U;
1539 count += 2U;
1540 }
1541
1542 if ((value & 0x1ULL) == 0x1ULL)
1543 {
1544 value >>= 1U;
1545 count += 1U;
1546 }
1547
1548 count -= ((value & 0x1ULL) == 0x0ULL);
1549 }
1550
1551 return count;
1552#endif
1553 }
1554#endif
1555
1556 //***************************************************************************
1559 //***************************************************************************
1560 template <typename T>
1561 ETL_CONSTEXPR14
1562 typename etl::enable_if<etl::is_integral<T>::value&& etl::is_signed<T>::value, uint_least8_t>::type
1564 {
1565 typedef typename etl::make_unsigned<T>::type unsigned_t;
1566
1567 return static_cast<T>(count_trailing_ones(static_cast<unsigned_t>(value)));
1568 }
1569
1570#if ETL_USING_8BIT_TYPES
1571 //***************************************************************************
1575 //***************************************************************************
1576 template <typename T>
1577 ETL_CONSTEXPR14
1579 count_leading_zeros(T value)
1580 {
1581#if ETL_USING_CPP20 && ETL_USING_STL
1582 return std::countl_zero(value);
1583#else
1584 uint_least8_t count = 0U;
1585
1586 if (value & 0x80U)
1587 {
1588 count = 0U;
1589 }
1590 else
1591 {
1592 count = 1U;
1593
1594 if ((value & 0xF0U) == 0U)
1595 {
1596 value <<= 4U;
1597 count += 4U;
1598 }
1599
1600 if ((value & 0xC0U) == 0U)
1601 {
1602 value <<= 2U;
1603 count += 2U;
1604 }
1605
1606 if ((value & 0x80U) == 0U)
1607 {
1608 value <<= 1U;
1609 count += 1U;
1610 }
1611
1612 count -= ((value & 0x80U) == 0x80U);
1613 }
1614
1615 return count;
1616#endif
1617 }
1618#endif
1619
1620 //***************************************************************************
1624 //***************************************************************************
1625 template <typename T>
1626 ETL_CONSTEXPR14
1627 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1629 {
1630#if ETL_USING_CPP20 && ETL_USING_STL
1631 return std::countl_zero(value);
1632#else
1633 uint_least8_t count = 0U;
1634
1635 if (value & 0x8000U)
1636 {
1637 count = 0U;
1638 }
1639 else
1640 {
1641 count = 1U;
1642
1643 if ((value & 0xFF00U) == 0U)
1644 {
1645 value <<= 8U;
1646 count += 8U;
1647 }
1648
1649 if ((value & 0xF000U) == 0U)
1650 {
1651 value <<= 4U;
1652 count += 4U;
1653 }
1654
1655 if ((value & 0xC000U) == 0U)
1656 {
1657 value <<= 2U;
1658 count += 2U;
1659 }
1660
1661 if ((value & 0x8000U) == 0U)
1662 {
1663 value <<= 1U;
1664 count += 1U;
1665 }
1666
1667 count -= ((value & 0x8000U) == 0x8000U);
1668 }
1669
1670 return count;
1671#endif
1672 }
1673
1674 //***************************************************************************
1678 //***************************************************************************
1679 template <typename T>
1680 ETL_CONSTEXPR14
1683 {
1684#if ETL_USING_CPP20 && ETL_USING_STL
1685 return std::countl_zero(value);
1686#else
1687 uint_least8_t count = 0U;
1688
1689 if (value & 0x80000000UL)
1690 {
1691 count = 0U;
1692 }
1693 else
1694 {
1695 count = 1U;
1696
1697 if ((value & 0xFFFF0000UL) == 0U)
1698 {
1699 value <<= 16U;
1700 count += 16U;
1701 }
1702
1703 if ((value & 0xFF000000UL) == 0U)
1704 {
1705 value <<= 8U;
1706 count += 8U;
1707 }
1708
1709 if ((value & 0xF0000000UL) == 0U)
1710 {
1711 value <<= 4U;
1712 count += 4U;
1713 }
1714
1715 if ((value & 0xC0000000UL) == 0U)
1716 {
1717 value <<= 2U;
1718 count += 2U;
1719 }
1720
1721 if ((value & 0x80000000UL) == 0U)
1722 {
1723 value <<= 1U;
1724 count += 1U;
1725 }
1726
1727 count -= ((value & 0x80000000UL) == 0x80000000UL);
1728 }
1729
1730 return count;
1731#endif
1732 }
1733
1734#if ETL_USING_64BIT_TYPES
1735 //***************************************************************************
1739 //***************************************************************************
1740 template <typename T>
1741 ETL_CONSTEXPR14
1744 {
1745#if ETL_USING_CPP20 && ETL_USING_STL
1746 return std::countl_zero(value);
1747#else
1748 uint_least8_t count = 0U;
1749
1750 if (value & 0x8000000000000000ULL)
1751 {
1752 count = 0U;
1753 }
1754 else
1755 {
1756 count = 1U;
1757
1758 if ((value & 0xFFFFFFFFF0000000ULL) == 0U)
1759 {
1760 value <<= 32U;
1761 count += 32U;
1762 }
1763
1764 if ((value & 0xFFFF000000000000ULL) == 0U)
1765 {
1766 value <<= 16U;
1767 count += 16U;
1768 }
1769
1770 if ((value & 0xFF00000000000000ULL) == 0U)
1771 {
1772 value <<= 8U;
1773 count += 8U;
1774 }
1775
1776 if ((value & 0xF000000000000000ULL) == 0U)
1777 {
1778 value <<= 4U;
1779 count += 4U;
1780 }
1781
1782 if ((value & 0xC000000000000000ULL) == 0U)
1783 {
1784 value <<= 2U;
1785 count += 2U;
1786 }
1787
1788 if ((value & 0x8000000000000000ULL) == 0U)
1789 {
1790 value <<= 1U;
1791 count += 1U;
1792 }
1793
1794 count -= ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL);
1795 }
1796
1797 return count;
1798#endif
1799 }
1800#endif
1801
1802 //***************************************************************************
1805 //***************************************************************************
1806 template <typename T>
1807 ETL_CONSTEXPR14
1808 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>::type
1810 {
1811 typedef typename etl::make_unsigned<T>::type unsigned_t;
1812
1813 return static_cast<T>(count_trailing_ones(static_cast<unsigned_t>(value)));
1814 }
1815
1816#if ETL_USING_8BIT_TYPES
1817 //***************************************************************************
1821 //***************************************************************************
1822 template <typename T>
1823 ETL_CONSTEXPR14
1825 count_leading_ones(T value)
1826 {
1827#if ETL_USING_CPP20 && ETL_USING_STL
1828 return std::countl_one(value);
1829#else
1830 uint_least8_t count = 0U;
1831
1832 if ((value & 0x80U) == 0U)
1833 {
1834 count = 0U;
1835 }
1836 else
1837 {
1838 count = 1U;
1839
1840 if ((value & 0xF0U) == 0xF0U)
1841 {
1842 value <<= 4U;
1843 count += 4U;
1844 }
1845
1846 if ((value & 0xC0U) == 0xC0U)
1847 {
1848 value <<= 2U;
1849 count += 2U;
1850 }
1851
1852 if ((value & 0x80U) == 0x80U)
1853 {
1854 value <<= 1U;
1855 count += 1U;
1856 }
1857
1858 count -= ((value & 0x80U) == 0x0U);
1859 }
1860
1861 return count;
1862#endif
1863 }
1864#endif
1865
1866 //***************************************************************************
1870 //***************************************************************************
1871 template <typename T>
1872 ETL_CONSTEXPR14
1873 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1875 {
1876#if ETL_USING_CPP20 && ETL_USING_STL
1877 return std::countl_one(value);
1878#else
1879 uint_least8_t count = 0U;
1880
1881 if ((value & 0x8000U) == 0U)
1882 {
1883 count = 0U;
1884 }
1885 else
1886 {
1887 count = 1U;
1888
1889 if ((value & 0xFF00U) == 0xFF00U)
1890 {
1891 value <<= 8U;
1892 count += 8U;
1893 }
1894
1895 if ((value & 0xF000U) == 0xF000U)
1896 {
1897 value <<= 4U;
1898 count += 4U;
1899 }
1900
1901 if ((value & 0xC000U) == 0xC000U)
1902 {
1903 value <<= 2U;
1904 count += 2U;
1905 }
1906
1907 if ((value & 0x8000U) == 0x8000U)
1908 {
1909 value <<= 1U;
1910 count += 1U;
1911 }
1912
1913 count -= ((value & 0x8000U) == 0U);
1914 }
1915
1916 return count;
1917#endif
1918 }
1919
1920 //***************************************************************************
1924 //***************************************************************************
1925 template <typename T>
1926 ETL_CONSTEXPR14
1929 {
1930#if ETL_USING_CPP20 && ETL_USING_STL
1931 return std::countl_one(value);
1932#else
1933 uint_least8_t count = 0U;
1934
1935 if ((value & 0x80000000UL) == 0UL)
1936 {
1937 count = 0U;
1938 }
1939 else
1940 {
1941 count = 1U;
1942
1943 if ((value & 0xFFFF0000UL) == 0xFFFF0000UL)
1944 {
1945 value <<= 8U;
1946 count += 8U;
1947 }
1948
1949 if ((value & 0xFF000000UL) == 0xFF000000UL)
1950 {
1951 value <<= 8U;
1952 count += 8U;
1953 }
1954
1955 if ((value & 0xF0000000UL) == 0xF0000000UL)
1956 {
1957 value <<= 4U;
1958 count += 4U;
1959 }
1960
1961 if ((value & 0xC0000000UL) == 0xC0000000UL)
1962 {
1963 value <<= 2U;
1964 count += 2U;
1965 }
1966
1967 if ((value & 0x80000000UL) == 0x80000000UL)
1968 {
1969 value <<= 1U;
1970 count += 1U;
1971 }
1972
1973 count -= ((value & 0x80000000UL) == 0UL);
1974 }
1975
1976 return count;
1977#endif
1978 }
1979
1980#if ETL_USING_64BIT_TYPES
1981 //***************************************************************************
1985 //***************************************************************************
1986 template <typename T>
1987 ETL_CONSTEXPR14
1990 {
1991#if ETL_USING_CPP20 && ETL_USING_STL
1992 return std::countl_one(value);
1993#else
1994 uint_least8_t count = 0U;
1995
1996 if ((value & 0x8000000000000000ULL) == 0ULL)
1997 {
1998 count = 0U;
1999 }
2000 else
2001 {
2002 count = 1U;
2003
2004 if ((value & 0xFFFFFFFF00000000ULL) == 0xFFFFFFFF00000000ULL)
2005 {
2006 value <<= 8U;
2007 count += 8U;
2008 }
2009
2010 if ((value & 0xFFFF000000000000ULL) == 0xFFFF000000000000ULL)
2011 {
2012 value <<= 8U;
2013 count += 8U;
2014 }
2015
2016 if ((value & 0xFF00000000000000ULL) == 0xFF00000000000000ULL)
2017 {
2018 value <<= 8U;
2019 count += 8U;
2020 }
2021
2022 if ((value & 0xF000000000000000ULL) == 0xF000000000000000ULL)
2023 {
2024 value <<= 4U;
2025 count += 4U;
2026 }
2027
2028 if ((value & 0xC000000000000000ULL) == 0xC000000000000000ULL)
2029 {
2030 value <<= 2U;
2031 count += 2U;
2032 }
2033
2034 if ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL)
2035 {
2036 value <<= 1U;
2037 count += 1U;
2038 }
2039
2040 count -= ((value & 0x8000000000000000ULL) == 0ULL);
2041 }
2042
2043 return count;
2044#endif
2045 }
2046#endif
2047
2048 //***************************************************************************
2051 //***************************************************************************
2052 template <typename T>
2053 ETL_CONSTEXPR14
2054 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>::type
2056 {
2057 typedef typename etl::make_unsigned<T>::type unsigned_t;
2058
2059 return static_cast<T>(count_leading_ones(static_cast<unsigned_t>(value)));
2060 }
2061
2062 //***************************************************************************
2066 //***************************************************************************
2067 template <typename T>
2068 ETL_CONSTEXPR14 uint_least8_t first_set_bit_position(T value)
2069 {
2070 return count_trailing_zeros(value);
2071 }
2072
2073 //***************************************************************************
2077 //***************************************************************************
2078 template <typename T>
2079 ETL_CONSTEXPR14 uint_least8_t first_clear_bit_position(T value)
2080 {
2081 value = ~value;
2082 return count_trailing_zeros(value);
2083 }
2084
2085 //***************************************************************************
2089 //***************************************************************************
2090 template <typename T>
2091 ETL_CONSTEXPR14 uint_least8_t first_bit_position(bool state, T value)
2092 {
2093 if (!state)
2094 {
2095 value = ~value;
2096 }
2097
2098 return count_trailing_zeros(value);
2099 }
2100
2101#if ETL_USING_8BIT_TYPES
2102 //*****************************************************************************
2105 //*****************************************************************************
2106 template <typename T>
2107 ETL_CONSTEXPR14
2109 binary_interleave(T first, T second)
2110 {
2111 uint16_t f = uint16_t(first);
2112 uint16_t s = uint16_t(second);
2113
2114 f = (f | (f << 4U)) & 0x0F0FU;
2115 f = (f | (f << 2U)) & 0x3333U;
2116 f = (f | (f << 1U)) & 0x5555U;
2117
2118 s = (s | (s << 4U)) & 0x0F0FU;
2119 s = (s | (s << 2U)) & 0x3333U;
2120 s = (s | (s << 1U)) & 0x5555U;
2121
2122 return (f | (s << 1U));
2123 }
2124#endif
2125
2126 //*****************************************************************************
2129 //*****************************************************************************
2130 template <typename T>
2131 ETL_CONSTEXPR14
2132 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint32_t>::type
2133 binary_interleave(T first, T second)
2134 {
2135 uint32_t f = uint32_t(first);
2136 uint32_t s = uint32_t(second);
2137
2138 f = (f | (f << 8U)) & 0x00FF00FFUL;
2139 f = (f | (f << 4U)) & 0x0F0F0F0FUL;
2140 f = (f | (f << 2U)) & 0x33333333UL;
2141 f = (f | (f << 1U)) & 0x55555555UL;
2142
2143 s = (s | (s << 8U)) & 0x00FF00FFUL;
2144 s = (s | (s << 4U)) & 0x0F0F0F0FUL;
2145 s = (s | (s << 2U)) & 0x33333333UL;
2146 s = (s | (s << 1U)) & 0x55555555UL;
2147
2148 return (f | (s << 1U));
2149 }
2150
2151#if ETL_USING_64BIT_TYPES
2152 //*****************************************************************************
2155 //*****************************************************************************
2156 template <typename T>
2157 ETL_CONSTEXPR14
2159 binary_interleave(T first, T second)
2160 {
2161 uint64_t f = uint64_t(first);
2162 uint64_t s = uint64_t(second);
2163
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;
2169
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;
2175
2176 return (f | (s << 1U));
2177 }
2178#endif
2179
2180 //*****************************************************************************
2183 //*****************************************************************************
2184 template <typename T>
2185 ETL_CONSTEXPR14
2186 typename etl::enable_if<etl::is_integral<T>::value && etl::is_signed<T>::value, T>::type
2187 binary_interleave(T first, T second)
2188 {
2189 return int64_t(binary_interleave(uint16_t(first), uint16_t(second)));
2190 }
2191
2192 //***************************************************************************
2195 //***************************************************************************
2196 template <typename T>
2197 ETL_CONSTEXPR typename etl::enable_if<etl::is_integral<T>::value, bool>::type
2198 is_odd(T value)
2199 {
2200 return ((static_cast<typename etl::make_unsigned<T>::type>(value) & 1U) != 0U);
2201 }
2202
2203 //***************************************************************************
2206 //***************************************************************************
2207 template <typename T>
2208 ETL_CONSTEXPR typename etl::enable_if<etl::is_integral<T>::value, bool>::type
2209 is_even(T value)
2210 {
2211 return ((static_cast<typename etl::make_unsigned<T>::type>(value) & 1U) == 0U);
2212 }
2213
2214 //***********************************
2215 template <typename T, size_t NBits>
2217 {
2218 public:
2219
2220 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2221
2222 static ETL_CONSTANT T value = static_cast<T>(etl::max_value_for_nbits<NBits>::value);
2223 };
2224
2225 template <typename T, size_t NBits>
2226 ETL_CONSTANT T lsb_mask<T, NBits>::value;
2227
2228 //***********************************
2229 template <typename T, size_t NBits>
2230 ETL_CONSTEXPR T make_lsb_mask()
2231 {
2232 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2233
2234 return lsb_mask<T, NBits>::value;
2235 }
2236
2237 //***********************************
2238 template <typename T>
2239 ETL_CONSTEXPR T make_lsb_mask(size_t nbits)
2240 {
2241 typedef typename etl::make_unsigned<T>::type type;
2242
2243 return (nbits == 0U) ? static_cast<T>(0)
2244 : static_cast<T>(static_cast<type>(~0) >> (etl::integral_limits<type>::bits - nbits));
2245 }
2246
2247 //***********************************
2248 template <typename T, size_t NBits>
2250 {
2251 public:
2252
2253 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2254
2255 static ETL_CONSTANT T value = static_cast<T>(etl::reverse_bits_const<T, lsb_mask<T, NBits>::value>::value);
2256 };
2257
2258 template <typename T, size_t NBits>
2259 ETL_CONSTANT T msb_mask<T, NBits>::value;
2260
2261 //***********************************
2262 template <typename T>
2263 ETL_CONSTEXPR T make_msb_mask(size_t nbits)
2264 {
2265 typedef typename etl::make_unsigned<T>::type type;
2266
2267 return (nbits == 0U) ? static_cast<T>(0)
2268 : static_cast<T>(static_cast<type>(~0) << (etl::integral_limits<type>::bits - nbits));
2269 }
2270
2271 //***********************************
2272 template <typename T, size_t NBits>
2273 ETL_CONSTEXPR T make_msb_mask()
2274 {
2275 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2276
2277 return msb_mask<T, NBits>::value;
2278 }
2279
2280 //***************************************************************************
2283 //***************************************************************************
2284 template <typename T>
2285 struct binary_not : public etl::unary_function<T, T>
2286 {
2287 //***********************************
2288 ETL_NODISCARD
2289 ETL_CONSTEXPR
2290 T operator ()(T value) const ETL_NOEXCEPT
2291 {
2292 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2293
2294 return ~value;
2295 }
2296 };
2297
2298 //***************************************************************************
2301 //***************************************************************************
2302 template <typename T>
2303 struct binary_and : public etl::unary_function<T, T>
2304 {
2305 //***********************************
2306 ETL_CONSTEXPR
2307 explicit binary_and(T parameter_) ETL_NOEXCEPT
2308 : parameter(parameter_)
2309 {
2310 }
2311
2312 //***********************************
2313 ETL_NODISCARD
2314 ETL_CONSTEXPR
2315 T operator ()(T value) const ETL_NOEXCEPT
2316 {
2317 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2318
2319 return value & parameter;
2320 }
2321
2322 private:
2323
2324 T parameter;
2325 };
2326
2327 //***************************************************************************
2330 //***************************************************************************
2331 template <typename T>
2332 struct binary_or : public etl::unary_function<T, T>
2333 {
2334 //***********************************
2335 ETL_CONSTEXPR
2336 explicit binary_or(T parameter_) ETL_NOEXCEPT
2337 : parameter(parameter_)
2338 {
2339 }
2340
2341 //***********************************
2342 ETL_NODISCARD
2343 ETL_CONSTEXPR
2344 T operator ()(T value) const ETL_NOEXCEPT
2345 {
2346 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2347
2348 return value | parameter;
2349 }
2350
2351 private:
2352
2353 T parameter;
2354 };
2355
2356 //***************************************************************************
2359 //***************************************************************************
2360 template <typename T>
2361 struct binary_xor : public etl::unary_function<T, T>
2362 {
2363 //***********************************
2364 ETL_CONSTEXPR
2365 explicit binary_xor(T parameter_) ETL_NOEXCEPT
2366 : parameter(parameter_)
2367 {
2368 }
2369
2370 //***********************************
2371 ETL_NODISCARD
2372 ETL_CONSTEXPR
2373 T operator ()(T value) const ETL_NOEXCEPT
2374 {
2375 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2376
2377 return value ^ parameter;
2378 }
2379
2380 private:
2381
2382 T parameter;
2383 };
2384
2385 //***************************************************************************
2388 //***************************************************************************
2390 {
2391 b00000000 = 0U,
2392 b00000001 = 1U,
2393 b00000010 = 2U,
2394 b00000011 = 3U,
2395 b00000100 = 4U,
2396 b00000101 = 5U,
2397 b00000110 = 6U,
2398 b00000111 = 7U,
2399 b00001000 = 8U,
2400 b00001001 = 9U,
2401 b00001010 = 10U,
2402 b00001011 = 11U,
2403 b00001100 = 12U,
2404 b00001101 = 13U,
2405 b00001110 = 14U,
2406 b00001111 = 15U,
2407 b00010000 = 16U,
2408 b00010001 = 17U,
2409 b00010010 = 18U,
2410 b00010011 = 19U,
2411 b00010100 = 20U,
2412 b00010101 = 21U,
2413 b00010110 = 22U,
2414 b00010111 = 23U,
2415 b00011000 = 24U,
2416 b00011001 = 25U,
2417 b00011010 = 26U,
2418 b00011011 = 27U,
2419 b00011100 = 28U,
2420 b00011101 = 29U,
2421 b00011110 = 30U,
2422 b00011111 = 31U,
2423 b00100000 = 32U,
2424 b00100001 = 33U,
2425 b00100010 = 34U,
2426 b00100011 = 35U,
2427 b00100100 = 36U,
2428 b00100101 = 37U,
2429 b00100110 = 38U,
2430 b00100111 = 39U,
2431 b00101000 = 40U,
2432 b00101001 = 41U,
2433 b00101010 = 42U,
2434 b00101011 = 43U,
2435 b00101100 = 44U,
2436 b00101101 = 45U,
2437 b00101110 = 46U,
2438 b00101111 = 47U,
2439 b00110000 = 48U,
2440 b00110001 = 49U,
2441 b00110010 = 50U,
2442 b00110011 = 51U,
2443 b00110100 = 52U,
2444 b00110101 = 53U,
2445 b00110110 = 54U,
2446 b00110111 = 55U,
2447 b00111000 = 56U,
2448 b00111001 = 57U,
2449 b00111010 = 58U,
2450 b00111011 = 59U,
2451 b00111100 = 60U,
2452 b00111101 = 61U,
2453 b00111110 = 62U,
2454 b00111111 = 63U,
2455 b01000000 = 64U,
2456 b01000001 = 65U,
2457 b01000010 = 66U,
2458 b01000011 = 67U,
2459 b01000100 = 68U,
2460 b01000101 = 69U,
2461 b01000110 = 70U,
2462 b01000111 = 71U,
2463 b01001000 = 72U,
2464 b01001001 = 73U,
2465 b01001010 = 74U,
2466 b01001011 = 75U,
2467 b01001100 = 76U,
2468 b01001101 = 77U,
2469 b01001110 = 78U,
2470 b01001111 = 79U,
2471 b01010000 = 80U,
2472 b01010001 = 81U,
2473 b01010010 = 82U,
2474 b01010011 = 83U,
2475 b01010100 = 84U,
2476 b01010101 = 85U,
2477 b01010110 = 86U,
2478 b01010111 = 87U,
2479 b01011000 = 88U,
2480 b01011001 = 89U,
2481 b01011010 = 90U,
2482 b01011011 = 91U,
2483 b01011100 = 92U,
2484 b01011101 = 93U,
2485 b01011110 = 94U,
2486 b01011111 = 95U,
2487 b01100000 = 96U,
2488 b01100001 = 97U,
2489 b01100010 = 98U,
2490 b01100011 = 99U,
2491 b01100100 = 100U,
2492 b01100101 = 101U,
2493 b01100110 = 102U,
2494 b01100111 = 103U,
2495 b01101000 = 104U,
2496 b01101001 = 105U,
2497 b01101010 = 106U,
2498 b01101011 = 107U,
2499 b01101100 = 108U,
2500 b01101101 = 109U,
2501 b01101110 = 110U,
2502 b01101111 = 111U,
2503 b01110000 = 112U,
2504 b01110001 = 113U,
2505 b01110010 = 114U,
2506 b01110011 = 115U,
2507 b01110100 = 116U,
2508 b01110101 = 117U,
2509 b01110110 = 118U,
2510 b01110111 = 119U,
2511 b01111000 = 120U,
2512 b01111001 = 121U,
2513 b01111010 = 122U,
2514 b01111011 = 123U,
2515 b01111100 = 124U,
2516 b01111101 = 125U,
2517 b01111110 = 126U,
2518 b01111111 = 127U,
2519 b10000000 = 128U,
2520 b10000001 = 129U,
2521 b10000010 = 130U,
2522 b10000011 = 131U,
2523 b10000100 = 132U,
2524 b10000101 = 133U,
2525 b10000110 = 134U,
2526 b10000111 = 135U,
2527 b10001000 = 136U,
2528 b10001001 = 137U,
2529 b10001010 = 138U,
2530 b10001011 = 139U,
2531 b10001100 = 140U,
2532 b10001101 = 141U,
2533 b10001110 = 142U,
2534 b10001111 = 143U,
2535 b10010000 = 144U,
2536 b10010001 = 145U,
2537 b10010010 = 146U,
2538 b10010011 = 147U,
2539 b10010100 = 148U,
2540 b10010101 = 149U,
2541 b10010110 = 150U,
2542 b10010111 = 151U,
2543 b10011000 = 152U,
2544 b10011001 = 153U,
2545 b10011010 = 154U,
2546 b10011011 = 155U,
2547 b10011100 = 156U,
2548 b10011101 = 157U,
2549 b10011110 = 158U,
2550 b10011111 = 159U,
2551 b10100000 = 160U,
2552 b10100001 = 161U,
2553 b10100010 = 162U,
2554 b10100011 = 163U,
2555 b10100100 = 164U,
2556 b10100101 = 165U,
2557 b10100110 = 166U,
2558 b10100111 = 167U,
2559 b10101000 = 168U,
2560 b10101001 = 169U,
2561 b10101010 = 170U,
2562 b10101011 = 171U,
2563 b10101100 = 172U,
2564 b10101101 = 173U,
2565 b10101110 = 174U,
2566 b10101111 = 175U,
2567 b10110000 = 176U,
2568 b10110001 = 177U,
2569 b10110010 = 178U,
2570 b10110011 = 179U,
2571 b10110100 = 180U,
2572 b10110101 = 181U,
2573 b10110110 = 182U,
2574 b10110111 = 183U,
2575 b10111000 = 184U,
2576 b10111001 = 185U,
2577 b10111010 = 186U,
2578 b10111011 = 187U,
2579 b10111100 = 188U,
2580 b10111101 = 189U,
2581 b10111110 = 190U,
2582 b10111111 = 191U,
2583 b11000000 = 192U,
2584 b11000001 = 193U,
2585 b11000010 = 194U,
2586 b11000011 = 195U,
2587 b11000100 = 196U,
2588 b11000101 = 197U,
2589 b11000110 = 198U,
2590 b11000111 = 199U,
2591 b11001000 = 200U,
2592 b11001001 = 201U,
2593 b11001010 = 202U,
2594 b11001011 = 203U,
2595 b11001100 = 204U,
2596 b11001101 = 205U,
2597 b11001110 = 206U,
2598 b11001111 = 207U,
2599 b11010000 = 208U,
2600 b11010001 = 209U,
2601 b11010010 = 210U,
2602 b11010011 = 211U,
2603 b11010100 = 212U,
2604 b11010101 = 213U,
2605 b11010110 = 214U,
2606 b11010111 = 215U,
2607 b11011000 = 216U,
2608 b11011001 = 217U,
2609 b11011010 = 218U,
2610 b11011011 = 219U,
2611 b11011100 = 220U,
2612 b11011101 = 221U,
2613 b11011110 = 222U,
2614 b11011111 = 223U,
2615 b11100000 = 224U,
2616 b11100001 = 225U,
2617 b11100010 = 226U,
2618 b11100011 = 227U,
2619 b11100100 = 228U,
2620 b11100101 = 229U,
2621 b11100110 = 230U,
2622 b11100111 = 231U,
2623 b11101000 = 232U,
2624 b11101001 = 233U,
2625 b11101010 = 234U,
2626 b11101011 = 235U,
2627 b11101100 = 236U,
2628 b11101101 = 237U,
2629 b11101110 = 238U,
2630 b11101111 = 239U,
2631 b11110000 = 240U,
2632 b11110001 = 241U,
2633 b11110010 = 242U,
2634 b11110011 = 243U,
2635 b11110100 = 244U,
2636 b11110101 = 245U,
2637 b11110110 = 246U,
2638 b11110111 = 247U,
2639 b11111000 = 248U,
2640 b11111001 = 249U,
2641 b11111010 = 250U,
2642 b11111011 = 251U,
2643 b11111100 = 252U,
2644 b11111101 = 253U,
2645 b11111110 = 254U,
2646 b11111111 = 255U
2647 };
2648
2649 //***************************************************************************
2652 //***************************************************************************
2654 {
2655 b0 = 0x1UL,
2656 b1 = 0x2UL,
2657 b2 = 0x4UL,
2658 b3 = 0x8UL,
2659 b4 = 0x10UL,
2660 b5 = 0x20UL,
2661 b6 = 0x40UL,
2662 b7 = 0x80UL,
2663 b8 = 0x100UL,
2664 b9 = 0x200UL,
2665 b10 = 0x400UL,
2666 b11 = 0x800UL,
2667 b12 = 0x1000UL,
2668 b13 = 0x2000UL,
2669 b14 = 0x4000UL,
2670 b15 = 0x8000UL,
2671 b16 = 0x10000UL,
2672 b17 = 0x20000UL,
2673 b18 = 0x40000UL,
2674 b19 = 0x80000UL,
2675 b20 = 0x100000UL,
2676 b21 = 0x200000UL,
2677 b22 = 0x400000UL,
2678 b23 = 0x800000UL,
2679 b24 = 0x1000000UL,
2680 b25 = 0x2000000UL,
2681 b26 = 0x4000000UL,
2682 b27 = 0x8000000UL,
2683 b28 = 0x10000000UL,
2684 b29 = 0x20000000UL,
2685 b30 = 0x40000000UL,
2686 b31 = 0x80000000UL
2687 };
2688}
2689
2690#endif
Definition binary.h:2217
Definition binary.h:2250
Definition binary.h:61
Definition binary.h:75
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 binary.h:2286
Definition binary.h:354
Definition for non-zero NBits.
Definition binary.h:91
Definition binary.h:481
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
Definition integral_limits.h:516
enable_if
Definition type_traits_generator.h:1254
is_unsigned
Definition type_traits_generator.h:1084
make_signed
Definition type_traits_generator.h:1234
make_unsigned
Definition type_traits_generator.h:1244
bitset_ext
Definition absolute.h:39
unary_function
Definition functional.h:151