Ну... Нет, н еобязательно чётное число даёт нуль, например N=6, (N & (N-1)) != 0
Там обычный битовый трюк, проверка, что число состоит ровно из одного бита (или нуль). Работает примерно так...
Допустим у нас есть число xxxx1000 где x какой-то произвольный бит. Если вычесть единицу, то получим число
xxxx0111, если теперь сделать &, то x & x = x, 1 & 0 = 0 & 1 = 0 Получаем xxxx0000, а значит N & (N-1) просто срабсывает самый младший установленный в единицу бит в нуль.
Ну а если сбросить один бит в нуль и получили нуль, то у нас был установлен только один бит, а это степени двойки. Итого, твой код напечатает Yes для степеней двойки: 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912 и т . д.
круто, спасибо! Можешь подсказать где про это можно почитать обстоятельно, как эту тему загуглить?