FastArduino v1.10
C++ library to build fast but small Arduino/AVR projects
Loading...
Searching...
No Matches
bits.h
Go to the documentation of this file.
1// Copyright 2016-2023 Jean-Francois Poilpret
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
16
21#ifndef BITS_HH
22#define BITS_HH
23
24#include <stdint.h>
25
33namespace bits
34{
41 static constexpr uint8_t BV8(uint8_t bit)
42 {
43 return uint8_t(1 << bit);
44 }
45
54 static constexpr uint8_t BV8(uint8_t bit1, uint8_t bit2)
55 {
56 return uint8_t(BV8(bit1) | BV8(bit2));
57 }
58
69 static constexpr uint8_t BV8(uint8_t bit1, uint8_t bit2, uint8_t bit3)
70 {
71 return uint8_t(BV8(bit1, bit2) | BV8(bit3));
72 }
73
86 static constexpr uint8_t BV8(uint8_t bit1, uint8_t bit2, uint8_t bit3, uint8_t bit4)
87 {
88 return uint8_t(BV8(bit1, bit2) | BV8(bit3, bit4));
89 }
90
105 static constexpr uint8_t BV8(uint8_t bit1, uint8_t bit2, uint8_t bit3, uint8_t bit4, uint8_t bit5)
106 {
107 return uint8_t(BV8(bit1, bit2, bit3) | BV8(bit4, bit5));
108 }
109
126 static constexpr uint8_t BV8(uint8_t bit1, uint8_t bit2, uint8_t bit3, uint8_t bit4, uint8_t bit5, uint8_t bit6)
127 {
128 return uint8_t(BV8(bit1, bit2, bit3) | BV8(bit4, bit5, bit6));
129 }
130
137 static constexpr uint8_t CBV8(uint8_t bit)
138 {
139 return uint8_t(~BV8(bit));
140 }
141
148 static constexpr uint16_t BV16(uint8_t bit)
149 {
150 return uint16_t(1 << bit);
151 }
152
161 static constexpr uint16_t BV16(uint8_t bit1, uint8_t bit2)
162 {
163 return uint16_t(BV16(bit1) | BV16(bit2));
164 }
165
176 static constexpr uint16_t BV16(uint8_t bit1, uint8_t bit2, uint8_t bit3)
177 {
178 return uint16_t(BV16(bit1, bit2) | BV16(bit3));
179 }
180
193 static constexpr uint16_t BV16(uint8_t bit1, uint8_t bit2, uint8_t bit3, uint8_t bit4)
194 {
195 return uint16_t(BV16(bit1, bit2) | BV16(bit3, bit4));
196 }
197
212 static constexpr uint16_t BV16(uint8_t bit1, uint8_t bit2, uint8_t bit3, uint8_t bit4, uint8_t bit5)
213 {
214 return uint16_t(BV16(bit1, bit2, bit3) | BV16(bit4, bit5));
215 }
216
233 static constexpr uint16_t BV16(uint8_t bit1, uint8_t bit2, uint8_t bit3, uint8_t bit4, uint8_t bit5, uint8_t bit6)
234 {
235 return uint16_t(BV16(bit1, bit2, bit3) | BV16(bit4, bit5, bit6));
236 }
237
244 static constexpr uint16_t CBV16(uint8_t bit)
245 {
246 return uint16_t(~BV16(bit));
247 }
248
253 static constexpr uint8_t COMPL(uint8_t value)
254 {
255 return uint8_t(~value);
256 }
257
261 static constexpr uint8_t LOW_BYTE(uint16_t value)
262 {
263 return uint8_t(value & uint16_t(UINT8_MAX));
264 }
265
269 static constexpr uint8_t HIGH_BYTE(uint16_t value)
270 {
271 return uint8_t(value >> 8);
272 }
273
281 static constexpr uint8_t OR8(uint8_t val1, uint8_t val2)
282 {
283 return uint8_t(val1 | val2);
284 }
285
293 static constexpr uint8_t OR8(uint8_t val1, uint8_t val2, uint8_t val3)
294 {
295 return uint8_t(val1 | OR8(val2, val3));
296 }
297
306 static constexpr uint8_t OR8(uint8_t val1, uint8_t val2, uint8_t val3, uint8_t val4)
307 {
308 return uint8_t(OR8(val1, val2) | OR8(val3, val4));
309 }
310
320 static constexpr uint8_t OR8(uint8_t val1, uint8_t val2, uint8_t val3, uint8_t val4, uint8_t val5)
321 {
322 return uint8_t(val1 | OR8(val2, val3, val4, val5));
323 }
324
335 static constexpr uint8_t OR8(uint8_t val1, uint8_t val2, uint8_t val3, uint8_t val4, uint8_t val5, uint8_t val6)
336 {
337 return uint8_t(OR8(val1, val2, val3) | OR8(val4, val5, val6));
338 }
339
347 static constexpr uint8_t IF8(bool flag, uint8_t val)
348 {
349 return uint8_t(flag ? val : 0U);
350 }
351
361 static constexpr uint8_t ORIF8(bool flag1, uint8_t val1, bool flag2, uint8_t val2)
362 {
363 return OR8(IF8(flag1, val1), IF8(flag2, val2));
364 }
365
376 static constexpr uint8_t ORIF8(bool flag1, uint8_t val1, bool flag2, uint8_t val2, bool flag3, uint8_t val3)
377 {
378 return OR8(IF8(flag1, val1), IF8(flag2, val2), IF8(flag3, val3));
379 }
380
393 static constexpr uint8_t ORIF8(
394 bool flag1, uint8_t val1, bool flag2, uint8_t val2, bool flag3, uint8_t val3, bool flag4, uint8_t val4)
395 {
396 return OR8(IF8(flag1, val1), IF8(flag2, val2), IF8(flag3, val3), IF8(flag4, val4));
397 }
398
413 static constexpr uint8_t ORIF8(bool flag1, uint8_t val1, bool flag2, uint8_t val2, bool flag3, uint8_t val3,
414 bool flag4, uint8_t val4, bool flag5, uint8_t val5)
415 {
416 return OR8(IF8(flag1, val1), IF8(flag2, val2), IF8(flag3, val3), IF8(flag4, val4), IF8(flag5, val5));
417 }
418
435 static constexpr uint8_t ORIF8(bool flag1, uint8_t val1, bool flag2, uint8_t val2, bool flag3, uint8_t val3,
436 bool flag4, uint8_t val4, bool flag5, uint8_t val5, bool flag6, uint8_t val6)
437 {
438 return OR8(IF8(flag1, val1), IF8(flag2, val2), IF8(flag3, val3),
439 IF8(flag4, val4), IF8(flag5, val5), IF8(flag6, val6));
440 }
441}
442
443#endif /* BITS_HH */
Defines utility methods for bits manipulation.
Definition: bits.h:34
static constexpr uint8_t COMPL(uint8_t value)
Return the uint8_t 2-complement of a byte.
Definition: bits.h:253
static constexpr uint8_t HIGH_BYTE(uint16_t value)
Extract the high byte (aka Most Significant Byte, MSB) of a uint16_t value.
Definition: bits.h:269
static constexpr uint8_t CBV8(uint8_t bit)
Create a uint8_t inverted bitmask for the given bit number.
Definition: bits.h:137
static constexpr uint8_t IF8(bool flag, uint8_t val)
return val if flag is true, otherwise 0, as an uint8_t.
Definition: bits.h:347
static constexpr uint8_t BV8(uint8_t bit)
Create a uint8_t bitmask for the given bit number.
Definition: bits.h:41
static constexpr uint16_t BV16(uint8_t bit)
Create a uint16_t bitmask for the given bit number.
Definition: bits.h:148
static constexpr uint8_t LOW_BYTE(uint16_t value)
Extract the low byte (aka Least Significant Byte, LSB) of a uint16_t value.
Definition: bits.h:261
static constexpr uint8_t ORIF8(bool flag1, uint8_t val1, bool flag2, uint8_t val2)
Create a uint8_t bitwise OR boolean operation between uint8_t operands, conditioned by bool flags.
Definition: bits.h:361
static constexpr uint8_t OR8(uint8_t val1, uint8_t val2)
Create a uint8_t bitwise OR boolean operation between uint8_t operands.
Definition: bits.h:281
static constexpr uint16_t CBV16(uint8_t bit)
Create a uint16_t inverted bitmask for the given bit number.
Definition: bits.h:244