[C++] Pole bitov

Programovacie jazyky, rady, poradňa...
sejnt
Amateur
Amateur
Príspevky: 11
Registrovaný: 15 nov 2009, 13:39
Bydlisko: Vysoka nad Kysucou

[C++] Pole bitov

Príspevok od používateľa sejnt »

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
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

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.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

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);
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

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"
Napísať odpoveď