Skip to content

Instantly share code, notes, and snippets.

@nadavmatalon
Created November 7, 2016 22:56
Show Gist options
  • Save nadavmatalon/e5929589df53f196fea0a14cdb6ef9a7 to your computer and use it in GitHub Desktop.
Save nadavmatalon/e5929589df53f196fea0a14cdb6ef9a7 to your computer and use it in GitHub Desktop.
bitSet & bitClear: Expanded Macros
// Reference: http://stackoverflow.com/questions/16683146/can-macros-be-overloaded-by-number-of-arguments
#ifdef bitSet
#undef bitSet
#endif
#ifdef bitClear
#undef bitClear
#endif
#define CAT( A, B ) A ## B
#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM )
#define GET_COUNT( _value, _1, _2, _3, _4, _5, _6, _7, _8, COUNT, ... ) COUNT
#define VA_SIZE( ... ) GET_COUNT( __VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, value )
#define VA_SELECT( NAME, ... ) SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__)
#define bitSet(value, ... ) VA_SELECT( bitSet, value, __VA_ARGS__ )
#define bitSet_1(value, bit0) ((value) |= (1UL << (bit0)))
#define bitSet_2(value, bit0, bit1) ((value) |= (1UL << (bit0)) | (1UL << (bit1)))
#define bitSet_3(value, bit0, bit1, bit2) ((value) |= (1UL << (bit0)) | (1UL << (bit1)) | (1UL << (bit2)))
#define bitSet_4(value, bit0, bit1, bit2, bit3) ((value) |= (1UL << (bit0)) | (1UL << (bit1)) | (1UL << (bit2)) | (1UL << (bit3)))
#define bitSet_5(value, bit0, bit1, bit2, bit3, bit4) ((value) |= (1UL << (bit0)) | (1UL << (bit1)) | (1UL << (bit2)) | (1UL << (bit3)) | (1UL << (bit4)))
#define bitSet_6(value, bit0, bit1, bit2, bit3, bit4, bit5) ((value) |= (1UL << (bit0)) | (1UL << (bit1)) | (1UL << (bit2)) | (1UL << (bit3)) | (1UL << (bit4)) | (1UL << (bit5)))
#define bitSet_7(value, bit0, bit1, bit2, bit3, bit4, bit5, bit6) ((value) |= (1UL << (bit0)) | (1UL << (bit1)) | (1UL << (bit2)) | (1UL << (bit3)) | (1UL << (bit4)) | (1UL << (bit5)) | (1UL << (bit6)))
#define bitSet_8(value, bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7) ((value) |= (1UL << (bit0)) | (1UL << (bit1)) | (1UL << (bit2)) | (1UL << (bit3)) | (1UL << (bit4)) | (1UL << (bit5)) | (1UL << (bit6)) | (1UL << (bit7)))
#define bitClear(value, ... ) VA_SELECT( bitClear, value, __VA_ARGS__ )
#define bitClear_1(value, bit0) ((value) &= ~(1UL << (bit0)))
#define bitClear_2(value, bit0, bit1) ((value) &= ~(1UL << (bit0)) & ~(1UL << (bit1)))
#define bitClear_3(value, bit0, bit1, bit2) ((value) &= ~(1UL << (bit0)) & ~(1UL << (bit1)) & ~(1UL << (bit2)))
#define bitClear_4(value, bit0, bit1, bit2, bit3) ((value) &= ~(1UL << (bit0)) & ~(1UL << (bit1)) & ~(1UL << (bit2)) & ~(1UL << (bit3)))
#define bitClear_5(value, bit0, bit1, bit2, bit3, bit4) ((value) &= ~(1UL << (bit0)) & ~(1UL << (bit1)) & ~(1UL << (bit2)) & ~(1UL << (bit3)) & ~(1UL << (bit4)))
#define bitClear_6(value, bit0, bit1, bit2, bit3, bit4, bit5) ((value) &= ~(1UL << (bit0)) & ~(1UL << (bit1)) & ~(1UL << (bit2)) & ~(1UL << (bit3)) & ~(1UL << (bit4)) & ~(1UL << (bit5)))
#define bitClear_7(value, bit0, bit1, bit2, bit3, bit4, bit5, bit6) ((value) &= ~(1UL << (bit0)) & ~(1UL << (bit1)) & ~(1UL << (bit2)) & ~(1UL << (bit3)) & ~(1UL << (bit4)) & ~(1UL << (bit5)) & ~(1UL << (bit6)))
#define bitClear_8(value, bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7) ((value) &= ~(1UL << (bit0)) & ~(1UL << (bit1)) & ~(1UL << (bit2)) & ~(1UL << (bit3)) & ~(1UL << (bit4)) & ~(1UL << (bit5)) & ~(1UL << (bit6)) & ~(1UL << (bit7)))
byte a = 0;
void setup() {
Serial.begin(9600);
Serial.print(F("\n"));
printb(a);
for (byte j=0; j<9; j++) {
if (j < 8) bitSet(a, j);
if (j) bitClear(a, j-1);
printb(a);
}
for (byte j=8; j>0; j--) {
if (j) bitSet(a, j-1);
if (j < 8) bitClear(a, j);
printb(a);
}
bitClear(a, 0);
printb(a);
bitSet(a, 1, 3, 5, 7);
printb(a);
bitClear(a, 1, 3, 5, 7);
bitSet(a, 0, 2, 4, 6);
printb(a);
bitSet(a, 1, 3, 5, 7);
printb(a);
bitClear(a, 0, 1, 2, 3, 4, 5, 6, 7);
printb(a);
}
void loop() {}
void printb(byte val) {
for (byte i=8; i>0; i--) Serial.print(bitRead(val, i-1));
Serial.print(F("\n"));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment