• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z funkcją zliczającą jedynki

Object Storage Arubacloud
0 głosów
201 wizyt
pytanie zadane 20 maja 2020 w C i C++ przez asdf123 Nowicjusz (150 p.)

Funkcja ma zliczyć sumę jedynek w reprezentacji binarnej wszystkich liczb z tablicy. Wiem, że problem z jej działaniem wynika z wyzerowania counter na początku, ale niestety nie wiem jak to naprawić 

long int Ones(long int array[], int size){
    int counter = 0;
    unsigned int mask = 1;
    for(int i = 0; i < 32; i++){
        if (array[size-1] bitand mask) {
            counter++;
        }
        mask <<= 1;
    }
    if (size>=1) Ones(array, size-1);
    return counter;
}

 

komentarz 20 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
czemu nie uzyjesz std::count, std::count_if?
komentarz 20 maja 2020 przez asdf123 Nowicjusz (150 p.)
niestety prowadzący nie pozwala
komentarz 21 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
W takim rszie, przekazuj ilosc obecnych jedynek, skoro chcesz to robic rekurencja, a nie petla

2 odpowiedzi

0 głosów
odpowiedź 21 maja 2020 przez mokrowski Mędrzec (156,100 p.)
wybrane 21 maja 2020 przez asdf123
 
Najlepsza
size_t Ones(long int array[], size_t size, size_t count = 0){
    if (size == 0) {
        return count;
    }
    --size;
    while(array[size] != 0) {
        count += array[size] & 0x01;
        array[size] >>= 1;
    }
    return Ones(array, size, count);
}

 

komentarz 21 maja 2020 przez asdf123 Nowicjusz (150 p.)
dziękuję!
komentarz 21 maja 2020 przez mokrowski Mędrzec (156,100 p.)

Wiesz, w zasadzie da się to napisać jeszcze sprytniej z użyciem dodatkowej rekurencji. Nie sądzę by jednak to było czytelne. C ani C++ nie nadają się za bardzo do takich eksperymentów:

unsigned CountInInt(int value, unsigned count = 0) {
    return value != 0 ? count += value & 0x01, CountInInt(value >> 1, count): count;
}

size_t Ones(long int array[], size_t size, size_t count = 0){
    return size != 0 ? --size, Ones(array, size, CountInInt(array[size], count)): count;
}

 

0 głosów
odpowiedź 21 maja 2020 przez TOM_CPP Pasjonat (22,640 p.)
edycja 21 maja 2020 przez TOM_CPP

Użyj algorytmu Brian Kernighan`s

size_t count_ones( size_t array[], int size )
{
    size_t counter {0};
    for( int i=0 ; i<size ; ++i )
    {
        for( size_t element = array[i]; element ; ++counter )
        {
          element &= element-1;
        }
    }

    return counter;
}

 

komentarz 21 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
Cos czuje, ze to zadanie na rekurencje z jakiegos uniwerku
komentarz 21 maja 2020 przez TOM_CPP Pasjonat (22,640 p.)
Zawsze można sobie przerobić pętlę na rekurencję.
komentarz 21 maja 2020 przez asdf123 Nowicjusz (150 p.)

@DragonCoder, a jednak polibuda ;) 
 

komentarz 21 maja 2020 przez asdf123 Nowicjusz (150 p.)

@TOM_CPP, rekurencja jest konieczna, a metoda musi bazować na operatorach bitowych, więc niestety nic mi to nie pomogło

komentarz 21 maja 2020 przez TOM_CPP Pasjonat (22,640 p.)

"Metoda" bazuje na operatorze bitowym &. Chyba że prowadzący zajęcia wprowadził wymóg użycia wszystkich możliwych operatorów bitowych.

 

komentarz 21 maja 2020 przez asdf123 Nowicjusz (150 p.)
wszystkich możliwych to nie, ale przynajmniej dwa

Podobne pytania

0 głosów
0 odpowiedzi 382 wizyt
0 głosów
1 odpowiedź 423 wizyt
pytanie zadane 2 listopada 2017 w C i C++ przez PanJaqb Początkujący (360 p.)
0 głosów
1 odpowiedź 246 wizyt
pytanie zadane 18 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...