Ссылаясь на код C++, написанный кем-то другим в CodeChef для конкретной проблемы, я нашел новый способ (по крайней мере, для меня) написания условного оператора, подобного этому: if (n & 1 << b)
. Весь фрагмент кода (функция) выглядит следующим образом:
int Solve(int tim, int n)
{
if (tim < 0)
return 1;
int res = 0;
for (int b = Maxb - 1; b >= 0; b--)
if (n & 1 << b)
{
int my = b - __builtin_popcount(tim & ((1 << b) - 1));
res += 1 << my;
if (tim & 1 << b)
return res;
}
res++;
return res;
}
Я знаю побитовую операцию И, а также операцию сдвига влево, когда мы используем по отдельности. Однако здесь комбинация обоих в условном операторе заставила меня запутаться, чтобы прочитать логику. Когда я искал ссылки, я не мог найти ситуации, когда обе операции встречаются вместе. Поэтому может ли кто-нибудь сказать мне значение или что именно здесь происходит?
n & (1 << b)
. Это помогает? - person Ry-♦   schedule 27.02.2018b
равно 0, это будетfalse
, так как оно вообще не будет зависеть отn
. еслиb > 0
, то это будет зависеть исключительно отn
. это странная конструкция, но правдоподобная для хакеров ядра. - person Shark   schedule 27.02.2018