Objaśnienie prostego kodu w C++

Objaśnienie prostego kodu w C++
luckiblue
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
#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;
}
ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
2

w tym przypadku jest to bezsensu zaciemnianie kodu

Kopiuj
czas & 1 

jest rownoznacznie z

Kopiuj
czas % 2 == 1
luckiblue
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
def algorytm(czas):
    wynik = 0
    while czas > 0:
        if czas % 2 == 1:
            wynik += 1
            czas /= 2
    print wynik
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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.

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.