Подумайте о том, что происходит, когда вы проверяете определенный бит:
1111 1111 (0xff)
& 0000 0100 (0x04, bit 2)
---- ----
= 0000 0100 (0x04)
Если вы оставите его таким, ваш результат будет самой битовой маской.
Теперь рассмотрим двойное отрицанието, что не то же самое, что ничего не делать:
!4 -> 0
!0 -> 1
Другими словами, !!4
дает вам 1
вместо 4
, и это гарантирует, что вы получите0/1
истинное значение, а не 0/whatever-the-bitmask-was
значение.
Следующая программа показывает это в действии:
#include <stdio.h>
#define test_bit0(_n,_p) (_n & (1u << _p))
#define test_bit1(_n,_p) !!(_n & (1u << _p))
int main (void) {
printf ("%d %d\n", test_bit0 (0xff, 2), test_bit1 (0xff,2));
return 0;
}
и выдает:
4 1
, как и ожидалось.
Кроме того: в наше время очень мало мест, где вы могли бы написать такой код, поскольку современные компиляторы более чем способны автоматически встроить код и выбрать наиболее эффективный способ.сделать операцию как ((_n & (1u << _p)) != 0)
.И не начинайте меня с использования тупых имен переменных, использование number
и position
обеспечивает гораздо большую читабельность, чем во время компиляции: -)