Давайте начнем с написания того, что на самом деле делает ваш код, на английском языке:
If any odd numbered bit (from 1 to 31) is clear return 0; otherwise return 1.
Теперь "any odd numbered bit (from 1 to 31)
" - это двоичное значение 10101010101010101010101010101010b, которое равно 0xAAAAAAAAUL
. Обратите внимание, что это значение невозможно для 32-разрядных целых чисел со знаком, поэтому мы хотим использовать целые числа без знака длиной не менее 32 бит.
Если бит сброшен, то x & 0xAAAAAAAAUL
не будет равен0xAAAAAAAAUL
.
Это дает:
int testdl4(unsigned long x) {
if( (x & 0xAAAAAAAAUL) != 0xAAAAAAAAUL) {
return 0;
}
return 1;
}
Обратите внимание, что сюда входит if
для получения того же поведения, что и ваш исходный код (например, возвращение 1
и отсутствие возвратаиспортил ненулевое значение).
Однако, логическое НЕ !
заставит ненулевое значение стать нулем, а нулевое значение - 1;так что вы можете сделать:
int testdl4(unsigned long x) {
return !((x & 0xAAAAAAAAUL) ^ 0xAAAAAAAAUL);
}