Created
November 7, 2016 22:56
-
-
Save nadavmatalon/e5929589df53f196fea0a14cdb6ef9a7 to your computer and use it in GitHub Desktop.
bitSet & bitClear: Expanded Macros
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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