Objaśnienie prostego kodu w C++

0

Mam problem ze zrozumieniem poniższego kodu w C++. Zwłaszcza z zapisem w warunku if(czas&1)wynik++.

#include <stdio.h>
int main()
{
int czas;
scanf("%d",&czas);
int wynik = 0;
while(czas>0)
{
if(czas&1)wynik++;
czas /= 2;
}
printf("%d\n",wynik);
return 0;
}
2

w tym przypadku jest to bezsensu zaciemnianie kodu

czas & 1 

jest rownoznacznie z

czas % 2 == 1
0

Ok, w takim razie gdzie robię błąd, bo staram się przepisać kod na pythonowski i program leci w nieskończoność..

def algorytm(czas):
    wynik = 0
    while czas > 0:
        if czas % 2 == 1:
            wynik += 1
            czas /= 2
    print wynik
1

@luckiblue: jeśli na wejściu czas jest liczbą dodatnią niepodzielną przez dwa, program będzie leciał w nieskończoność, ponieważ nigdy nie zmodyfikujesz wartości zmiennej czas.

2
winerfresh napisał(a)

Skoro to C++ to znacznie lepiej było by to napisać tak: std::bitset<sizeof(int) * 8>(czas).count(), to powinno zostać skrócone do 1 instrukcji popcount

Co dokładnie się dzieje, jeżeli kompilator jest pewien, że procesor to obsługuje (np. odpowiednia flaga -march w GCC). Dokładnie jest to instrukcja popcnt i pojawiła się u Intela w Nehalemie (2008) a u AMD w K10 (2007).

https://godbolt.org/g/qrBS5m

1 użytkowników online, w tym zalogowanych: 0, gości: 1