#define bitSetNew(value, bit) ((value) |= ((sizeof(value) <= sizeof(uint32_t)) ? 1UL : 1ULL) << (bit))
uint32_t var32 = 0;
uint64_t var64 = 0;
typedef void (*BitSetFunc)(byte);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Start");
}
void loop() {
runTest("Old32 ", true, setOld32, 32);
runTest("New32 ", true, setNew32, 32);
runTest("New64-32", false, setNew64, 33);
runTest("New64-64", false, setNew64, 64);
}
void runTest(char* msg, byte is32Bit, BitSetFunc bsFunc, byte num) {
constexpr unsigned long MaxCount {10000UL};
unsigned long count = 0;
unsigned long start = micros();
while (count < MaxCount) {
count++;
bsFunc(num);
}
unsigned long stop = micros();
Serial.print(msg);
Serial.print(" = ");
Serial.println((stop - start) / MaxCount);
//printBinary(is32Bit);
}
void printBinary(bool is32) {
uint64_t var = (is32) ? var32 : var64;
uint32_t lw = (uint32_t) var;
if (!is32) {
uint32_t hg = (uint32_t)(var >> 32);
Serial.print("High32 = ");
Serial.println(hg, BIN);
}
Serial.print("Low32 = ");
Serial.println(lw, BIN);
}
void setOld32(byte num) {
var32 = 0;
for (byte sh = 0; sh < num; sh++) {
bitSet(var32, sh);
};
}
void setNew32(byte num) {
var32 = 0;
for (byte sh = 0; sh < num; sh++) {
bitSetNew(var32, sh);
};
}
void setOld64(byte num) {
var64 = 0;
for (byte sh = 0; sh < num; sh++) {
bitSet(var64, sh);
};
}
void setNew64(byte num) {
var64 = 0;
for (byte sh = 0; sh < num; sh++) {
bitSetNew(var64, sh);
};
}