Jump to content
php.lv forumi

Bitwise operācijas


Robis

Recommended Posts

Vai kāds nezin kādu labu materiālu, kur ir labi izskaidrots par bitwise operācijām - ar piemēriem, tā lai piemēram, uzrakstot echo 21 << 14; es varu prognozēt pats, kas izvadīsies :) Nemaz nerunājot par sarežgjītākām bitwise operācijām...

Link to comment
Share on other sites

Tur jau nekā sarežģīta nav.

21 uzraksti binārā formā: 10101

21 << 14 nozīmē pabīdīt skaitli par 14 bitiem pa kreisi, tb labajā pusē pierakstīt 14 nulles:

10101 << 14 = 1010100000000000000

Pārvērt skaitli atpakaļ uz decimālo sistēmu, dabūsi atbildi: 344064

 

Vēl viens triks ar bitwise shift operācijām ir, ka tās reāli nozīmē reizināšanu/dalīšanu ar divnieka pakāpi.

Vispārīgajā gadījumā x<<y = x * 2^y un x>>y = x / 2^y (kur ar ^ apzīmēju kāpināšanas operāciju).

Tad 21<<14 = 21 * 2^14 = 21 * 16384 = 344064

 

A visas pārējās bitwise operācijas ir diezgan elementāras:

| - or - bitus rēķina katru ar katru, rezultāta bits ir 0 tad un tikai tad, ja abi inputa biti ir 0

& - and - bitus rēķina katru ar katru, rezultāta bits ir 1 tad un tikai tad, ja abi inputa biti ir 1

^ - xor - bitus rēķina katru ar katru, rezultāta bits ir 0 tad un tikai tad, ja abi inputa biti ir vienādi

~ - not - rezultāta biti ir vienkārši samainīti uz otru bitu (tb 1->0 un 0->1)

 

Galvenais ir pārvērst skaitļus binārā formātā (vai arī hex, jo ar to ar var diezgan viegli operēt), un viss pārējais ir nieks.

 

Wikipēdijai nav ne vainas, tur nemaz neskatījies? http://en.wikipedia.org/wiki/Bitwise_operation

 

<offtopic>Te nu redzam vienu piemēru pie kā noved tava attieksme pret IT izglītību universitātē.<offtopic>

Link to comment
Share on other sites

Paldies par info. Par shift ir skaidrs, bet par pārējiem īsti vēl nē... Kā es varu zināt, kā var pārvest binārā formātā un atpakaļ? Kādi sanāks simoblu?

 

P.S. kāda ir bitwise operācijau praktiskā nozīmē?

 

P.S.S. šis ir pirmais, ko saskāros, ko varēja man iemācīt augstskolā, bet pamatā visa praktika - nē. Arī šo var iemācīties pats - matemātika ta ir zināma...

Link to comment
Share on other sites

Nu ja jau var iemācīties, ko nemācies? Pilns internets ar informāciju, sākot jau ar wikipēdiju.

 

Skaitīšanas sistēmā B skaitlis N izsakās sekojošā formā: N = x0 * B^0 + x1 * B^1 + x2 * B^2 + ... xI * B^I, kur x0, x1, x2, ..., xI ir skaitļa N cipari B skaitīšanas sistēmā. No šejienes attiecīgi var dabūt pārvēršanas formulas uz skaitīšanas sistēmu B:

x0 = N % B

x1 = (N - x0 * B^0) % B^2

x2 = (N - x1 * B^1 - x0 * B^0) % B^3

...

xI = (N - ... - x2 * B^2 - x1 * B^1 - x0 * B^0) % B^I

 

Savukārt, ja ir doti skaiļa N cipari B-nieku skaitīšanas sistemā: x0,x1,x2,...,xI, tad tos pārvērst uz skaitli N var ar jau augstāk minēto formulu: N = x0 * B^0 + x1 * B^1 + x2 * B^2 + ... xI * B^I.

 

Praktiskā nozīme ir jebkur. Tava datora procesors viszemākajā līmenī māk skaitīt tikai bināri. Tāpēc, ja gribēsi programmēt zemā līmenī, tad agrāk vai vēlāk nāksies saprast un lietot bitwise operācijas.

Ar bitwise operācijām var izpildīt jebkuru "augsta" līmeņa operāciju - saskaitīšanu, atņemšanu, ...

Vēl tipisks piemērs bitu-flagi. Ja ir kautkādas īpašības, kuras ir neatkarīgas viena no otras, tad tās var neglabāt 10 atsevišķos boolean mainīgajos, bet gan vienā 10-bitīgā skaitlī, kurā katrs bits nozīmē attiecīgo īpašību (1-ir, 0-nav). Attiecīgi OR jālieto, lai uzstādītu flagu, AND - lai noņemtu, XOR - lai pamainītu uz pretējo, NOT un shifti - lai izveidotu vajadzīgās maskas bitu uzstādīšanai/noņemšanai. Lai gan PHP no tā nebūs īsti nekādas jēgas, jo tur tāpat viss izpildās relatīvi lēni, taču zema līmeņa programmēšanas valodās atkarībā no situācijas tas var izrādīties ievērojami ātrāk.

Link to comment
Share on other sites

<offtopic>

Te nu redzam vienu piemēru pie kā noved tava attieksme pret IT izglītību universitātē.

 

Te arī: http://php.lv/f/index.php?showtopic=8009

 

Tiešām nebiju gaidījis, ka redzēšu šādu topiku/jautājumus no tevis...

 

Obligāti vienmēr tā morāle ir vajadzīga?

Ne Tu viņu radīji, ne mācīsi.

 

</offtopic>

Link to comment
Share on other sites

Skatos, ka esi palicis par lielu offtopic-māsteri :)

 

Obligāti vienmēr tā morāle ir vajadzīga?

Ne Tu viņu radīji, ne mācīsi.

Domā es to pašu nevaru pateikt par Tevi? - Ne Tu mani radīji, ne tu mani mācīsi. Vienmēr vajadzīgs te Tavu morāli ielikt?

Neredzu nekādu morāli. Es tikai izteicu savas domas. Morāle būtu, ja teiktu ka šitā ir slikti un vajag darīt savādāk un tml garā.

 

Jā, un "tur arī" pilnīgi nekas par izglītību nebija teikts.

Link to comment
Share on other sites

×
×
  • Create New...