22//
33// FILE: bitHelpers.h
44// AUTHOR: Rob Tillaart
5- // VERSION: 0.1.2
5+ // VERSION: 0.1.3
66// DATE: 2015-11-07
77// PURPOSE: Arduino library with functions on bit level
88// URL: https://github.com/RobTillaart/bitHelpers
99//
1010// 0.0.1 2015-11-07 initial version
11- // 0.1.0 2020-07-29 intial release
11+ // 0.1.0 2020-07-29 initial release
1212// 0.1.1 2020-08-10 added BitsNeeded, bitSet64 family
13- // 0.1.2 2020-12-14 add Adruino-ci + unit tests
13+ // 0.1.2 2020-12-14 add Arduino-CI + unit tests
14+ // 0.1.3 2021-08-09 update readme.md + unit tests
15+
1416
1517#include "Arduino.h"
1618
19+
1720#define BH_BIG_NR 1000000000
1821
22+
1923////////////////////////////////////////////////
2024//
2125// BIT COUNT TEST
@@ -130,6 +134,7 @@ uint8_t bitCount(uint64_t value)
130134 return v & 0x7F ;
131135};
132136
137+
133138////////////////////////////////////////////////
134139//
135140// BIT REVERSE
@@ -176,6 +181,7 @@ uint64_t bitReverse(uint64_t val)
176181 return x ;
177182}
178183
184+
179185////////////////////////////////////////////////
180186//
181187// NYBBLE REVERSE
@@ -242,6 +248,7 @@ uint64_t byteReverse(uint64_t val)
242248 return x ;
243249}
244250
251+
245252////////////////////////////////////////////////
246253//
247254// WORD REVERSE
@@ -261,6 +268,7 @@ uint64_t wordReverse(uint64_t val)
261268 return x ;
262269}
263270
271+
264272////////////////////////////////////////////////
265273//
266274// SWAP HI LO
@@ -285,11 +293,12 @@ uint64_t swap(uint64_t val)
285293 return (val << 32 ) | (val >> 32 );
286294}
287295
296+
288297////////////////////////////////////////////////
289298//
290299// BIT ROTATE LEFT
291300//
292- uint8_t bitRotateLeft (uint8_t value , uint8_t pos )
301+ uint8_t bitRotateLeft (uint8_t value , uint8_t pos )
293302{
294303 if (pos > 7 ) return value ;
295304 return (value << pos ) | (value >> (8 - pos ));
@@ -313,6 +322,7 @@ uint64_t bitRotateLeft(uint64_t value, uint8_t pos)
313322 return (value << pos ) | (value >> (64 - pos ));
314323}
315324
325+
316326////////////////////////////////////////////////
317327//
318328// BIT ROTATE RIGHT
@@ -341,62 +351,65 @@ uint64_t bitRotateRight(uint64_t value, uint8_t pos)
341351 return (value << (64 - pos )) | (value >> pos );
342352}
343353
354+
344355////////////////////////////////////////////////////
345356//
346357// BIT FLIP
347358//
348- uint8_t bitFlip (uint8_t value , uint8_t pos )
359+ uint8_t bitFlip (uint8_t value , uint8_t pos )
349360{
350361 if (pos > 7 ) return value ;
351362 return value ^ (1 << pos );
352363}
353364
354- uint16_t bitFlip (uint16_t value , uint8_t pos )
365+ uint16_t bitFlip (uint16_t value , uint8_t pos )
355366{
356367 if (pos > 15 ) return value ;
357368 return value ^ (1 << pos );
358369}
359370
360- uint32_t bitFlip (uint32_t value , uint8_t pos )
371+ uint32_t bitFlip (uint32_t value , uint8_t pos )
361372{
362373 if (pos > 31 ) return value ;
363374 return value ^ (1UL << pos );
364375}
365376
366- uint64_t bitFlip (uint64_t value , uint8_t pos )
377+ uint64_t bitFlip (uint64_t value , uint8_t pos )
367378{
368379 if (pos > 63 ) return value ;
369380 return value ^ (1ULL << pos );
370381}
371382
383+
372384////////////////////////////////////////////////////
373385//
374386// BIT ROT
375387//
376- uint8_t bitRot (uint8_t value , float chance = 0.5 )
388+ uint8_t bitRot (uint8_t value , float chance = 0.5 )
377389{
378390 if (random (BH_BIG_NR ) > chance * BH_BIG_NR ) return value ;
379391 return value ^ (1 << random (8 ));
380392}
381393
382- uint16_t bitRot (uint16_t value , float chance = 0.5 )
394+ uint16_t bitRot (uint16_t value , float chance = 0.5 )
383395{
384396 if (random (BH_BIG_NR ) > chance * BH_BIG_NR ) return value ;
385397 return value ^ (1UL << random (16 ));
386398}
387399
388- uint32_t bitRot (uint32_t value , float chance = 0.5 )
400+ uint32_t bitRot (uint32_t value , float chance = 0.5 )
389401{
390402 if (random (BH_BIG_NR ) > chance * BH_BIG_NR ) return value ;
391403 return value ^ (1UL << random (32 ));
392404}
393405
394- uint64_t bitRot (uint64_t value , float chance = 0.5 )
406+ uint64_t bitRot (uint64_t value , float chance = 0.5 )
395407{
396408 if (random (BH_BIG_NR ) > chance * BH_BIG_NR ) return value ;
397409 return value ^ (1ULL << random (64 ));
398410}
399411
412+
400413////////////////////////////////////////////////////
401414//
402415// BIT-SET64 -CLEAR64 -TOGGLE64 -READ64 -WRITE64
@@ -411,6 +424,7 @@ uint64_t bitRot(uint64_t value, float chance = 0.5)
411424#define mbitRead64 (value , bit ) ( ((value) & ((sizeof(value)<5?1UL:1ULL) <<(bit))) ? 1 : 0)
412425#define mbitWrite64 (value , bit , bitvalue ) (bitvalue ? mbitSet64(value, bit) : mbitClear64(value, bit))
413426
427+
414428// FUNCTIONS
415429#if defined(__AVR__ )
416430
@@ -480,6 +494,7 @@ void bitToggle64(uint64_t & x, uint8_t bit)
480494
481495#endif
482496
497+
483498uint8_t bitRead64 (uint64_t & x , uint8_t bit )
484499{
485500 return x & (1ULL << bit );
@@ -542,6 +557,7 @@ uint8_t bitsNeeded(uint64_t x)
542557 return bitsNeeded ((uint32_t )x );
543558}
544559
560+
545561////////////////////////////////////////////////////
546562//
547563// NEXT
0 commit comments