Nu prea are sens chestiunea aia.
Cred ca stii ce face if-ul
In ce priveste parametrul !(i&(i-1))
! in fata expresiei inseamna negat, adica if-ul se executa atunci cand i&(i-1) este fals.
i&(i-1) este mereu fals
& reprezinta un operator pe biti, adica compara bitii variabilelor si returneaza 1 (adevarat) doar daca toti bitii sunt egali, adica practic daca numerele sunt egale, insa i & (i-1) nu este niciodata adevarat, asa cum probabil ti-ai dat seama.
Si cout << n-- pur si simplu decrementeaza n-ul introdus de la tastatura mai sus.
Pur si simplu nu are nici un sens rezolvarea asta