Fromris
 
 
 
 
 
VI
 
 
Buhalterinė apskaita verslui. Dirbame Vilniuje.  Tel. +370 672 49472
 

Operacijos su bitais (Bitwise Operations)

 

Kompiuteris viską laiko bitais – nuliais ir vienetais. Bitų operacijos leidžia viename skaičiuje laikyti daug „taip / ne“ reikšmių, jas akimirksniu patikrinti, įjungti ir išjungti. Taip veikia failų teisės, PHP klaidų lygiai, IP tinklai – ir tai vienas naudingiausių būdų saugoti būsenas bei nustatymus duomenų bazėje.

Kalkuliatorius (32 bitai)

Skaičių galima įvesti bet kuriame lauke: HEX su 0x ar be, BIN su tarpais ar be. Spustelėjus bitą – jis persijungia.

Bitų operacijos

Operacija atliekama kiekvienai bitų porai atskirai. Spustelėk eilutę – pavyzdys įsikels į kalkuliatorių.

ŽenklasPavadinimasTaisyklėPavyzdysKam naudojama
&AND (ir)1 tik jei abu bitai 11100 & 1010 = 1000patikrinti ar išvalyti bitus (kaukė)
|OR (arba)1, jei bent vienas 11100 | 1010 = 1110įjungti bitus
^XOR (arba-arba)1, jei bitai skirtingi1100 ^ 1010 = 0110perjungti bitus, rasti skirtumus. PostgreSQL rašoma #
~NOT (ne)apverčia visus bitus~1100 = …0011kaukės neigimas: x & ~F
<<poslinkis kairėnkiekvienas žingsnis – ×20011 << 2 = 11001 << n – n-tasis bitas
>>poslinkis dešinėnkiekvienas žingsnis – ÷21100 >> 2 = 0011ištraukti lauką iš skaičiaus

Standartiniai receptai

x – saugoma reikšmė, F – vėliavėlė (vienas ar keli bitai). Spustelėk – įsikels į kalkuliatorių.

IšraiškaKą daroPavyzdys
x | FĮjungti vėliavėlę1001 | 0100 = 1101
x & ~FIšjungti vėliavėlę1101 & ~0100 = 1001
x ^ FPerjungti1101 ^ 0100 = 1001
(x & F) != 0Ar įjungta?1101 & 0100 = 0100 → taip
(x & F) == FAr įjungtos visos iš kelių?1101 & 0101 = 0101 → taip
(x & (T|N)) == TTuri visas T ir neturi nė vienos Nvienas palyginimas vietoj kelių
(x & (x-1)) == 0Ar skaičius yra 2 laipsnis?10000 & 01111 = 0 → taip
x & -xŽemiausias įjungtas bitas1100 & …0100 = 0100
1 << nn-tojo bito reikšmė1 << 5 = 32
(x >> 8) & 0xFIštraukti 4 bitų lauką nuo 8-o bito0xB00 → 11

Dėmesio skliaustams: PHP, C, C++, JavaScript kalbose == stipresnis už &, todėl x & 4 == 4 reiškia x & (4 == 4). Rašyk (x & 4) == 4. Python – atvirkščiai, ten & stipresnis.

Linux komanda chmod 755 – teisės kaip bitų reikšmių suma

Failo teisės – tai 9 bitai: po tris savininkui, grupei ir kitiems. Kiekvienas trejetas – vienas aštuntainis skaitmuo, todėl teisės rašomos aštuntaine sistema.

SavininkasGrupėKiti
teisėrwxr-xr-x
bitas111101101
svoris421421421
suma4+2+1 = 74+1 = 54+1 = 5

ls -l rodo tą patį: -rwxr-xr-x. Įprastam failui – 644 (rw-r--r--). O umask 022 – tiesiog kaukė: naujo failo teisės 666 & ~022 = 644. Patikrink kalkuliatoriuje OCT lauke: 755 = 111 101 101.

PHP E_ALL – binarinė sandara ir kaip ji augo su versijomis

error_reporting(E_ERROR | E_WARNING | E_PARSE) – tai trijų bitų OR: 1 | 2 | 4 = 7. Augant PHP, nauji klaidų tipai buvo pridedami tik kairėje (didesnio svorio bitai), o seni niekada nepakeitė reikšmės – todėl 2005 m. parašytas error_reporting(7) veikia ir šiandien.

1 įjungtas   1 naujas šioje versijoje   0 pašalintas iš E_ALL. PHP 8.4 išėmė E_STRICT (2048), bet bitas 11 neatiduotas kitam tipui – lieka tuščias. Užveskite pelę ant langelio – matysite konstantą.

Patarimas: error_reporting(-1) įjungia viską bet kurioje versijoje – -1 dvejetainėje sistemoje yra vien vienetai. php.ini supranta operatorius | & ~ ^ !, o httpd.conf reikia rašyti jau suskaičiuotą skaičių.

IPv4 tinklo maskė – kodėl vieni kompiuteriai mato vienas kitą, o kiti ne

IPv4 adresas – 32 bitų skaičius. Maskė – irgi 32 bitai: vienetai kairėje žymi tinklo dalį, nuliai dešinėje – kompiuterio dalį. /24 reiškia 24 vienetus. Kompiuteris, prieš siųsdamas paketą, daro vieną AND: jei (mano_IP & maskė) == (gavėjo_IP & maskė) – siunčia tiesiai, jei ne – per šliuzą (gateway).

Užsakymų būsenų saugojimas viename lauke

Jei būsena saugoma kaip vienas tekstas ar skaičius (busena = 'atmestas'), kiekvienas naujas įrašas ištrina ankstesnį. Kai būsenos saugomos bitais, naujas įvykis tik įjungia savo bitą – visa istorija lieka tame pačiame lauke.

Užsakymo kelias

Spaudyk įvykius eilės tvarka ir palygink abu laukus. Paspaudus dar kartą, bitas išjungiamas (busena & ~F) – įprastas laukas tada lieka nepakitęs.

Paieška pagal bitus

Visa paieška – vienas palyginimas: kaukė T|N išrenka dominančius bitus, o rezultatas turi būti lygus T. Pavyzdiniai užsakymai, atitinkantys sąlygą, pažymėti žaliai:

Sąžiningai apie ribas: bitas pasako, kad įvykis buvo, bet ne kada – datoms reikia žurnalo lentelės. integer talpina 31 vėliavėlę (32-as bitas – ženklas), bigint – 63. Esamų bitų prasmės keisti negalima.

Praktinis panaudojimas

Nustatymai, kurių vis daugėja

Viename skaičiuje galima laikyti ne tik vėliavėles, bet ir mažus laukus – lygį ar balus. Svarbiausia iš anksto suplanuoti vietą: naujus bitus pridėti tik kairėje, o laisvą vietą rezervuoti.

Taisyklės: nauja vėliavėlė – tik į laisvą vietą kairėje; esamų bitų niekada nepernumeruok ir pašalintų nenaudok iš naujo (kaip PHP su E_STRICT); laukui palik vietos augti; 31-ą bitą integer lauke palik ramybėje – jis ženklas. Jei reikšmė gali augti neribotai (tikri taškai, pinigai) – jai atskiras stulpelis.

Įdomūs faktai ir istorija

  • 1703Gottfriedas Leibnizas paskelbia dvejetainės aritmetikos aprašymą. Jis džiaugėsi radęs jos atspindį senovės kinų „Permainų knygos“ (I Ching) heksagramose.
  • 1854George'as Boole'is knygoje „The Laws of Thought“ aprašo algebrą, kurioje tėra dvi reikšmės ir operacijos IR, ARBA, NE. Jo garbei loginis tipas vadinamas boolean.
  • 193721-erių Claude'as Shannonas magistro darbe parodo, kad Boole'io algebra tiksliai aprašo relių grandines. Šis darbas dažnai vadinamas svarbiausiu kada nors parašytu magistro darbu.
  • ~1947Statistikas Johnas Tukey sugalvoja žodį bit – binary digit. 1948 m. jį išpopuliarina Shannonas savo informacijos teorijos straipsnyje.
  • 1960Peteris Wegneris aprašo triuką x & (x-1) – jis nuima žemiausią vienetą. Taip bitai suskaičiuojami tiek kartų, kiek yra vienetų, o ne 32 kartus.
  • 1993Įvedamas CIDR – maskės /24, /20 ir t. t. vietoj senųjų A, B, C tinklų klasių. Be jo IPv4 adresai būtų baigęsi dar anksčiau.
  • 1999Žaidime Quake III atvirkštinė kvadratinė šaknis skaičiuojama bitų triuku su paslaptinga konstanta 0x5f3759df – trupmeninis skaičius interpretuojamas kaip sveikasis.
  • 2011Vasario 3 d. IANA išdalija paskutinius laisvus IPv4 blokus – 232 ≈ 4,29 mlrd. adresų pasauliui nebeužteko.
  • 2014Dainos „Gangnam Style“ peržiūrų skaitiklis priartėja prie 2 147 483 647 (231−1) – YouTube tenka pereiti prie 64 bitų skaitiklių.
  • 2038Sausio 19 d. 03:14:07 UTC 32 bitų laikas su ženklu persipildys ir „nušoks“ į 1901 metus. Išbandyk: įvesk į A 2147483648 ir įjunk „Su ženklu“.
  • FaktasXOR leidžia sukeisti du kintamuosius be trečio: a ^= b; b ^= a; a ^= b; Gražu, bet šiuolaikiniai kompiliatoriai su laikinu kintamuoju susitvarko greičiau.
 
 
 
 
© 2005 - 2026   Fromris, UAB    v3.3.15   2026-10-31 23:10:08
Kontaktams | Apie įmonę
 

Skelbimai, akvariumų kainos:

Juodas, lengvas gruntas akvariumui, skatina augalų augimą: Jbl Manado Dark

Limituotos serijos, prestižinis led apšvietimas 60-80cm akvariumui, valdomas per programėlę: Chihiros Wrgb II 10th Edition

Stilingas led šviestuvas akvariumui: AQUAEL Leddy 10w

CO2 tirpintuvas akvariumui, molonu akiai kai burbuliukai ritmiškai kyla ir mažėja: Dennerle Co2 Flipper