Мне нужна программа, которая возвращает количество конечных нулей в двоичном представлении числа. Я нашел в Интернете функцию, написанную на C, но я не понимаю, как она работает.
Это функция:
unsigned tzr(unsigned x)
{
unsigned n; /* number of bits */
n = 0;
if (!(x & 0x0000FFFF)) { n += 16; x >>= 16; }
if (!(x & 0x000000FF)) { n += 8; x >>= 8; }
if (!(x & 0x0000000F)) { n += 4; x >>= 4; }
if (!(x & 0x00000003)) { n += 2; x >>= 2; }
n += (x & 1) ^ 1; // anyway what does this do ?
return n;
}
Теперь я действительно пытался понять, как это работает, но я не понимаю. Мне действительно нужен кто-то, кто мог бы объяснить это мне, я нахожу этот код очень сложным.
А что касается этих шестнадцатеричных констант, то это их значения:
0x0000FFFF
= 65535
0x000000FF
= 255
0x0000000F
= 15
0x00000003
= 3
Теперь, почему программа использует эти значения и выполняет побитовое И с числом?
Затем я знаю, что если вы хотите обрабатывать большие числа, вы должны
использовать while
вместо первого оператора if
, например:
while (!(x & 0x0000FFFF)) { bits += 16; x >>= 16; } // why should I need this ?
Но я не знаю почему! Какая разница в использовании while
вместо if
в этом случае?
F
является двоичным1111
. - person Barmar   schedule 24.07.2017!(x & 0x0000FFFF))
, на английском языке, используя такие слова, какbits from {m} to {n} are {all|not all} {ones|zeroes}
. - person n. 1.8e9-where's-my-share m.   schedule 24.07.2017