- първи вариант, който ми дойде наум:
брой на единици от бит_0 до бит_X,
проверка остатъка при делене на 2 (%2): 1 (нечетно), 0 (четно)
но въобще не го пробвах.
- втори вариант:
начален бит "сума по модул две" (изключващо ИЛИ, XOR) със следващия бит, до края (може и наобратно: до началото). Работи.
за целите на необходимото пресмятане:
parity от бит m_start до бит m_stop
Код за потвърждение:
bool parity_u64(uint64_t x, uint8_t m_start, uint8_t m_stop) { // parity check, false: odd, true: even
bool p = 0;
x >>= m_start;
for (uint8_t i = m_start; i <= m_stop; i++) {
p ^= (x & 0x01);
x >>= 1;
}
return p;
}
Проверка с число от конкретния ми пример:
uint64_t h = 0b0000100100000110010011100001101001001100001000001000000100000000;
Serial.println(parity_u64(h, 31, 63));
пресметнато с молива: 1

, получено през Serial monitor: 1

.