Zdar , mam takuto ulohu , mam vypisat vsetky prvocisla od 2 do zadaneho cisla, danu postupnost mam reprezentovat ako pole bitov typu int , takze cisla 0 az 31 budu ulozene ako bity 0 az 31 prvneho prvku pola
cisel typu int, cisla 32 az 64 budu ulozene ako bity 0 az 31 druheho prvku pola cisel typu int. Algoritmus by som vedel len vobec neviem prist nato ako mam tie cisla reprezentovat v tom bitovom poli , dik za help
[C++] Pole bitov
No ja som to zadanie robil takto:
Pouzil by som unsigned int(kedze int ma 32 bitov a teda -2^16»2^16-1, pri unsigned to bude od 0»2^32-1.
Potom pouzijem int ako keby to bolo pole boolov a len budem pripocitavat 2^cislo-1 k tomu integru. Takze napriklad ked zistim, ze su prvocisla 2,3,5,7, tak budem mat integer=2^1+2^2+2^4+2^6.
A vypis prvocisel na konci staci spravit cyklus, kde overujes zvysok po deleni 2.
Pouzil by som unsigned int(kedze int ma 32 bitov a teda -2^16»2^16-1, pri unsigned to bude od 0»2^32-1.
Potom pouzijem int ako keby to bolo pole boolov a len budem pripocitavat 2^cislo-1 k tomu integru. Takze napriklad ked zistim, ze su prvocisla 2,3,5,7, tak budem mat integer=2^1+2^2+2^4+2^6.
A vypis prvocisel na konci staci spravit cyklus, kde overujes zvysok po deleni 2.
Index prvku môžeš získať ako p / 32 a číslo bitu potom ako p % 32; a teda môžeš použiť niečo ako:
Kód: Vybrať všetko
a[p/32] |= 1 << (p % 32);Ty si ziadnu strukturu vytvarat nemusis mas proste iba pole integrov, kazdy integer ma 32 bitov. Takze uz kazdy samotny integer si predstav ako pole bitov, len na pristup k jeho prvkom nebudes pouzivat index, len budes posuvat bity na miesto kde maju byt.
Takze napriklad ked chces zapisat informaciu o cisle CISLO, tak si ju rozdelis na dva "indexy", prvy vypocitas ako CISLO / 32 a druhy ako zvysok po tomto deleni(cize CISLO % 32). Prvy pouzijes pri pristupe ku konkretnemu integeru a druhy ku konkretnemu bitu. A toto vsetko vyjadruje to co napisal chrono: a[CISLO / 32] |= 1 << (CISLO % 32) , kde ta znacka << znamena bitovy posun vlavo a posuva 1 o pocet bitov ktore je na pravej strane
a zapis |= znamena to iste ako keby tam bolo a[CISLO / 32] = a[CISLO / 32] | (1 << (CISLO % 32)) ...a | je OR, alebo "bitovy sucet"
Takze napriklad ked chces zapisat informaciu o cisle CISLO, tak si ju rozdelis na dva "indexy", prvy vypocitas ako CISLO / 32 a druhy ako zvysok po tomto deleni(cize CISLO % 32). Prvy pouzijes pri pristupe ku konkretnemu integeru a druhy ku konkretnemu bitu. A toto vsetko vyjadruje to co napisal chrono: a[CISLO / 32] |= 1 << (CISLO % 32) , kde ta znacka << znamena bitovy posun vlavo a posuva 1 o pocet bitov ktore je na pravej strane