Years ago, I cloned the Arduino IDE “bit” macros for use in a GCC program (for testing generic Arduino code on a different system). I dug them out recently for a work project, and decided to share them here. Maybe they will be useful to someone else. (And apologies for WordPress clobbering the ampersand and turning it to HTML. When I edit and view it, it looks good, then WordPress “helps” — even though I am using a Syntax Highlighter plugin specifically for code examples.)
#ifndef BITMACROS_H #define BITMACROS_H // Bit macros, based on Arduino standard. // https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bit/ // // x: the numeric variable to which to write. // n: which bit of the number to write, starting at 0 for the least-significant (rightmost) bit. // b: the value to write to the bit (0 or 1). #define bit(n) (1 << (n)) #define bitSet(x, n) ((x) |= bit(n)) #define bitClear(x, n) ((x) &= ~bit(n)) #define bitRead(x, n) (((x) & bit(n)) !=0 ) #define bitWrite(x, n, b) ((b) ? bitSet((x), (n)) : bitClear((x), (n))) /* Verification tests: bool showBits (uint32_t value, unsigned int bits) { bool status; //printf ("showBits (%u, %u)\n", value, bits); if ((bits == 0) || (bits > sizeof(value)*8)) { status = false; } else { // Must use signed to check against 0. for (int bit = (bits-1); bit >= 0; bit--) { printf ("%u", bitRead(value, bit)); } printf ("\n"); } return status; } int main() { unsigned int value; // Test bit() for (unsigned int bit = 0; bit < 8; bit++) { printf ("bit(%u) = %u\n", bit, bit(bit)); } printf ("\n"); // Test bitSet() for (unsigned int bit = 0; bit < 8; bit++) { value = 0; printf ("bitSet(%u, %u) = ", value, bit); bitSet(value, bit); showBits (value, 8); } printf ("\n"); // Test bitClear() for (unsigned int bit = 0; bit < 8; bit++) { value = 0xff; printf ("bitClear(%u, %u) = ", value, bit); bitClear (value, bit); showBits (value, 8); } printf ("\n"); // Test bitRead() value = 0b10101111; showBits (value, 8); for (unsigned int bit = 0; bit < 8; bit++) { printf ("bitRead(%u, %u) = %u\n", value, bit, bitRead (value, bit)); } printf ("\n"); // Test bitWrite - 1 value = 0x00; showBits (value, 8); for (unsigned int bit = 0; bit < 8; bit++) { printf ("bitWrite(%u, %u, 1) = ", value, bit); bitWrite (value, bit, 1); showBits (value, 8); } // Test bitWrite - 0 showBits (value, 8); for (unsigned int bit = 0; bit < 8; bit++) { printf ("bitWrite(%u, %u, 0) = ", value, bit); bitWrite (value, bit, 0); showBits (value, 8); } printf ("\n"); return EXIT_SUCCESS; } */ #endif // BITMACROS_H // End of BitMacros.h