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

Sito Eratostenesa w C

Object Storage Arubacloud
0 głosów
530 wizyt
pytanie zadane 19 marca 2022 w C i C++ przez yachikson Nowicjusz (120 p.)

Witam, dostałem na studiach takie zadanie:

Zaimplementuj algorytm sita eratostenesa do obliczania kolejnych liczb pierwszych. W implementacji sita zapisz informacje o każdej liczbie (czy jest pierwsza czy nie) na jednym bicie(skorzystaj z operacji bitowych)

O ile sama implementacja sita nie stanowi dla mnie problemu to niejasne jest dla mnie drugie zdanie(zapisz informacje o każdej liczbie na jednym bicie). Czy mógłby ktoś mnie naprowadzić o co w tym zdaniu chodzi i jak sie do tego zadania zabrać ? Z góry dzięki.

 

1
komentarz 19 marca 2022 przez Oscar Nałogowiec (29,290 p.)

Sito Eratostenesa wymaga tablicy true-false na każdą badaną liczbę. Kiedyś gdy implementowałem taki algorytm w pascalu (na Odrze 1305) użyłem konstrukcji:

packed array [2..10000000] of boolean;

Nie zmieściłoby to się w 1MB pamięci tej maszyny gdyby każdy element tablicy zajmował cały jeden bajt. Na szczęście słówko packed oznaczało, że kompilator ma to upchać jak się da i w jednym bajcie znalazło się 8 elementów (po 1 bicie). Choć pewnie było to po 24 elementy w słowie (Odra miała 24 bitowe słowo). Dzięki temu 128kB pamięci i 15 minut pracy wystarczyło.

Masz zaimplemetować upchaną tablice operacjami bitowymi - do tego służą operatory &, | i ^. Działają one w ten sposób, że argumenty są traktowane jako ciąg bitów (8, 16, 32 lub 64 bitów) i oblicz się odpowiednio iloczum logiczny, sumę logiczną lub xor w trybie bit w bit. Do twoich celów będziesz musiał stosować tzw maski - czyli takie liczby w których tylko jeden bit jest 1 a reszta zerem (lub odwrotnie). Wykorzystując takie maski możesz operować na pojedynczych bitach liczby.

sprawdzenie bitu:     wartość & maska

ustawienie bitu:  wartość |= maska

skasowanie bitu:   wartość &= ~maska

Oczywiście będzie trzeba rozbić wartość liczby (indeksu) na część adresującą bajty lub słowa i część indeksującą bit w słowie.

 

komentarz 20 marca 2022 przez toko Dyskutant (7,670 p.)

@yachikson,  @Oscar bardzo ładnie rozpisał, ja tylko dopowiem, że żeby stworzyć maskę z 1 na i-tym bicie i 0 na pozostałych używa się operatora << ( 1 << i ). Np. 1 << 5 to 00100000.

1 odpowiedź

0 głosów
odpowiedź 20 marca 2022 przez mokrowski Mędrzec (155,460 p.)
Masz od tego std::bitset. Posiada operatory bitowe, przesunięć... https://en.cppreference.com/w/cpp/utility/bitset

Podobne pytania

0 głosów
3 odpowiedzi 425 wizyt
0 głosów
1 odpowiedź 345 wizyt
pytanie zadane 19 listopada 2018 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...