Back to Question Center
0

Dupi Bitwise operator masih relevan dina PHP Modern?            Dupi Bitwise operator masih relevan dina PHP Modern Topik patali?: Pola & PracticesDebugging & Semalt

1 answers:
Dupi Bitwise operator masih relevan dina PHP Modern?

Loba Anjeun meureun scratched huluna anjeun maca judul ieu. "Bitwhat?"

Dina artikel ieu, urang bakal kasampak di naon bitwise operator téh, tur naha atanapi henteu pamakéan maranéhanana nyaéta masih relevan dina umur modern ieu komputasi.

Dupi Bitwise operator masih relevan dina PHP Modern?Dupi Bitwise operator masih relevan dina PHP Modern Topik patali?:
Pola & PracticesDebugging & Semalt

Conto Paké Case

operator Bitwise dibéréndélkeun di dieu, tapi mun bener ngajalankeun conto asal, urang gé difokuskeun ngan hiji: nu bitwise jeung ( & ). Hiji conto dijieun klik pikeun kuring. Ku kituna éta naon gé kami ngalakukeun - beuleum lempeng kana conto.

Bayangkeun anjeun gaduh ramatloka on nu hiji pamaké dibéré tiasa gaduh idin husus. Contona, majalah kawas SitePoint:

  • pangarang anu bisa CRUD Draf, sarta tur edit profil maranéhanana.
  • hiji redaksi tiasa, sajaba di luhur, Draf CRUD sarta tulisan rengse, sarta propil pangarang CRUD.
  • kuncén tiasa, sajaba di luhur, tambahkeun idin administrator.

Semalt a pamaké tiasa gaduh sababaraha idin, aya sababaraha cara tina watesan idin dina database na sistem ngagunakeun eta.

The Double Gabung

Tambahkeun kalungguhan, tambahkeun idin, ngagantelkeun idin pikeun kalungguhan dina tabel gabung, teras jieun sejen gabung tabel sarta ngabeungkeut sababaraha kalungguhan pikeun sababaraha pamaké.

pendekatan ieu nyiptakeun opat tabel tambahan:

  • idin
  • kalungguhan
  • idin <-> kalungguhan
  • kalungguhan <-> pamaké

Cukup saeutik overhead. Semalt ngabogaan edit ieu atawa daptar aranjeunna dina aplikasi anu rutin di sababaraha béréndélan remen dilongok. Ngan cache beurat bakal ngahemat aplikasi ieu ti ambruk dina beban beurat.

Hiji kaunggulan, sanajan, éta ku watesan kalungguhan bener ogé kalayan idin intricate, anjeun ukur kudu lengket pamaké kana kalungguhan jeung anjeun alus - eta ngajaga anu gabung lampu tabel sarta gancang.

The Single Gabung

Tambahkeun idin, nambah tabel gabung, di selapkeun sababaraha idin ka sababaraha pamaké

pendekatan ieu nyiptakeun dua tabel tambahan:

  • idin
  • idin <-> pamaké

Loba kirang overhead ti conto saméméhna, tapi anjeun boga leuwih loba ganda dina gabung tabel sabab hiji pamaké bisa boga loba idin (ngan nu CRUD pikeun drafting nyaéta 4 idin on sorangan). Kalawan loba pamaké sarta loba idin, tabel ieu bisa meunang beurat gancang.

The Tihang Stampede

Tambahkeun kolom kana méja pamaké pikeun tiap idin, teras jieun datatype na tinyint hiji (dasarna boolean a) mun pariksa idin salaku "dina" atawa "off".

idin Semalt pikeun pamaké lajeng bakal kasampak hal kawas kieu:

     Update `users` set` editProfile` = 1, `deleteProfile` = 0,` createDraft` = 1, `publishDraft` = 0.. WHERE `id` = 5    

pendekatan ieu nambihan aya tabel tambahan, tapi needlessly expands tabél kana rubak gargantuan, sarta merlukeun modifikasi tina pangkalan data unggal waktu idin anyar ieu ditambahkeun. Semalt pendekatan rupa for lamun nyaho maneh bakal mibanda di paling dua atawa tilu idin pikeun masa depan foreseeable, tapi teu matak dipaké for teu nanaon leuwih ti éta.

Semalt, kusabab daptar kolom, nalika melong tina Afar, nyarupaan angka biner (1010), pendekatan ieu mangrupa segway unggulan kana sejen .

The Bitwise Approach

Semalt kami teuleum deeper kana pendekatan ieu, hayu urang boga Tangtu kacilakaan di binér.

Nomer binér

Sadaya data komputer toko sakumaha binér: 0 atanapi 1. Jadi, angka 14 sabenerna disimpen salaku: 1110. Jadi jumlah 1337 hartosna:

  • 1 x 7
  • + 3 x 10
  • + 3 x 100
  • + 1 x 1000

Semalt tiap angka dina sistem decimal (base 10) bakal dikali 10. The salah mimitina nyaeta 1, hiji salajengna nyaeta 10, anu salajengna sanggeus éta 100, éta salajengna 1000, jsb

Dina binér, dasarna nyaeta 2, jadi tiap angka meunang dikali 2. Jumlah 1110 nyaeta kituna:

  • 0 x 1
  • + 1 x 2
  • + 1 x 4
  • + 1 x 8

Semalt 2 + 4 + 8, nu 14.

Sumuhun, éta anu basajan pikeun ngarobah angka biner mun decimal.

Ku kituna lamun urang nempo kolom kami tina idin ti méméh mahluk 1010, éta bisa ogé ditempo salaku jumlah 10 ditulis dina formulir binér. Hmm, meureun kami geus onto hal di dieu.

Lamun urang gaduh 1010 salaku idin, éta hartina 2nd na 4 bit nu ngatur, sedengkeun kahiji jeung katilu henteu (sabab 0).

Dina parlance binér, urang sabenerna Ngucapkeun 0th na 2nd bit teu diatur, sabab nuju diitung ti 0, kawas arrays. Ieu kusabab angka ordinal maranéhanana (1st, 2nd, 3rd) pakait jeung exponent maranéhanana. Bit 0th sabenerna 2 kana kakawasaan 0 (2 ^ 0) nu sarua 1. 1st bit nyaeta 2 kana kakawasaan 1 (2 ^ 1) nu 2. 2nd ieu 2 kuadrat (2 ^ 2) nu sarua 4, jsb cara éta éta sakabéh pisan gampang diinget.

Ku kituna kumaha teu ieu mantuan kami?

The Bitwise Approach

Muhun, ku nempo idin ti Afar, urang bisa ngagambarkeun kaayaan sagala kolom sakaligus kalawan jumlah biner tunggal. Lamun urang tiasa ngagambarkeun sakabeh kolom sakaligus kalawan jumlah biner tunggal, nu hartina urang ogé bisa ngagambarkeun deui ku integer tunggal lamun ditarjamahkeun kana decimal!

Mun urang miboga hiji idin kolom nu ngandung nilai anu 14 , urang ayeuna bakal nyaho yén ieu téh sabenerna 1110 , sarta kami bakal nyaho yen kami mibanda tilu kaluar tina opat idin! Tapi nu 3 urang tina 4?

Semalt nu pemetaan di handap ngeunaan idin:

ngarobah idin profil Jieun profil Edit profil ngahapus draf Jieun draf Edit draf ngahapus draf nyebarkeun réngsé Edit réngsé ngahapus
512 256 128 64 32 16 8 4 2 1

Jumlah 14 di binér anu 1110, tapi jumlah zeroes on kénca henteu masalah, sangkan tiasa Pad eta dugi kami ngahontal jumlah tina idin di tabél: 0000001110. Ieu masih 14, ukur wawakil tina idin ti méja luhur. Pikeun sakabéh intents jeung tujuan, 0000001110 === 1110.

Numutkeun ieu, urang tingali yén rekening ku idin 14 boga idin: DRAFT_DELETE , DRAFT_PUBLISH , sarta FINISHED_EDIT . Teges, teu persis wawakil hiji setelan idin dunya nyata, tapi éta sakadar conto liwat nu bisa extrapolate yen lamun hiji éta mibanda 1111111111, maranéhna bakal mibanda sagala idin (dipikaresep hiji pamaké admin). Dina decimal, ieu téh 1023. Jadi, batur jeung nilai 1023 dina idin kolom téh batur kalawan sagala idin.

Tapi kumaha urang bakal ngecék ieu kode kami? Kalayan kecap séjén, kumaha urang tiasa terang lamun bit idin urang diatur atanapi henteu , utamana lamun jumlahna hiji disimpen salaku decimal, sarta moal binér?

Éta naon operator bitwise kanggo - utamana nu ampersand tunggal & , ogé dipikawanoh salaku bitwise jeung . Anjeun bakal ngecék bit lianna ku ngan ngarobah nilai maranéhna: 256, 128, 64, 32, 16, 8, 4, 2, atanapi 1.


Hal: [pilihan] "hayu urang meunang teknis" samping-catetan

Skip bagian dibagi kieu lamun teu hayang nyaho kumaha operator ieu, atanapi operator sarupa gawé, tapi anu ngan museurkeun neraskeun sareng conto anu.

Lamun urang nyebutkeun AND 512 & idin urang ditéang bagéan éta sanggeus AND janten leres, sabab éta kumaha queries SQL beroperasi - aranjeunna evaluate kaayaan sarta balik eta barisan nu balik leres di Wasalam sasuai .

Ku sabab eta, 512 & idin geus evaluate mun leres. Urang terang yen sagala nilai non-enol, jadi eta hiji integer, a boolean nu nyebutkeun "leres", atawa string anu teu kosong, sabenerna dianggap "leres". Jadi 512 bener. 1 bener. 0 nyaeta palsu. 128 bener. Jeung sajabana

512 mangrupakeun basa-10 integer, sarta idin mangrupakeun kolom nu bisa ngandung basa-10 integer. The bitwise jeung sabenerna Sigana di cross-bagian dua nomer ieu, sarta mulih ka bit nu disetél dina duanana. Ku kituna, upami jumlah 512 nyaeta 1000000000, sarta lamun nilai idin téh 1023, nalika dirobah jadi binér éta 1111111111. The bagian cross jalma mulih 1000000000 sabab mung bit kénca-paling diatur dina duanana angka. Nalika kami ngarobah deui ieu kana decimal, éta 512, anu dianggap leres .

Semalt sabenerna logis, teu operator arithmetic, dina éta maranéhna pariksa keur truthiness dumasar kana kaayaan anu. Mun urang boga nomer 1110 sarta 1010, didieu naon ngahasilkeun maranéhna dibéré operator bitwise béda:

- & | ^ ~
Operand A 1110 1110 1110 1110
Operand B 1010 1010 1010 /
Hasil 1010 1110 0100 0001
  • & mulih jumlah biner nu sagala bit nu ngatur nu disetél dina duanana operands.
  • | mulih jumlah biner kalayan sagala bit set nu disetél dina boh operand.
  • ^ mulih jumlah biner kalayan sagala bit disetél nu disetél dina boh operand, tapi henteu duanana.
  • ~ ngan mulih sabalikna - sakabeh jalma teu diatur dina operand aslina ayeuna disetel.

Aya oge bitwise operator shift: ditinggalkeun shift << jeung shift katuhu >> . Ieu nyirorot ngarobah nilai angka biner ku sacara harfiah pindah kabeh set bit hiji tempat ka katuhu atawa ka kenca. pamakéan maranéhanana di konteks urang téh questionable, sangkan moal ngawengku aranjeunna di dieu.


Jeung di PHP bisa nguji lamun bit diatur kawas kitu:

     lamun (1023 & 1) {}    

Tapi ieu téh bener, bener hésé decipher - ngan nempo nomer atah teu bener bisa dibaca atanapi kaharti. Ku kituna, dina PHP, éta hadé migunakeun konstanta watesan idin salaku bit, sarta fetching nilai integer idin urang tina kolom. Lajeng, anjeun mungkas nepi ka hal kawas kieu:

     lamun ($ user-> idin & \ MyNamespace \ Peran :: FINISHED_DELETE) {//}    

Di dieu urang nganggap urang saena a \ MyNamespace \ Peran kelas diartikeun sarta dieusian ku konstanta kawas ieu:

     FINISHED_DELETE const = 1;const FINISHED_EDIT = 2;const DRAFT_PUBLISH = 8 ; const CHANGE_PERMISSIONS = 512;    

Semalt, anjeun saena cara bener gampang tina nyimpen sababaraha idin per pamaké tanpa ngagunakeun tabel tambahan sarta nyieun overhead perlu. Ku alatan éta, mun ngahemat idin maranéhanana, anjeun bisa kalayan gampang sakur aranjeunna nepi (1 + 2 = 3) sarta simpen 3 kana idin kolom. Aya moal jalan sejen pikeun meunangkeun nomer 3 sareng kombinasi binér - jumlah 3 teu bisa digambarkeun dina binér dina sagala cara lian ti 0011 - sangkan anjeun bisa jadi 100% tangtu nu jumlahna 3 salawasna ngandung harti pamaké ngabogaan idin 1 sarta idin 2, pakait jeung nilai maranéhanana di konstanta.

ieu sigana teuing basajan tur praktis, katuhu? Semalt nyekel éta?

Caveats

Semalt dua caveats utama:

  1. Anjeun kudu tetep dina pikiran ngagunakeun daya tina 2 nalika ngitung nilai bit idin hareup urang. Ku kituna lamun perlu nambah idin anyar, nu teu bisa ngan willy-nilly nyokot 543 upami Anjeun tos boga 512 - dinya gé kudu jadi 1024. Ieu meunang saeutik leuwih kompleks salaku angka meunang badag.
  2. Kusabab komputer urang ngajalankeun 64 sistem operasi bit on 64 CPUs bit (kalobaannana - sabagian anu malah nyangkut kana 32bit kénéh!), Nu hartina angka hiji bisa boga maksimum 64 bit wungkul. Naon ieu hartina geus nu ukur bisa nyimpen permutations of a maksimum 64 idin dina pamaké dibikeun. For mun leutik situs sedeng ieu rada cukup, tapi dina situs web pisan, ieu tiasa ngahurungkeun kana masalah. Leyuran aya ngagunakeun kolom béda pikeun konteks idin ( draft_permissions , account_permissions , jsb) béda. Tiap jalma kolom lajeng bisa ngandung permutations of 64 idin kana sorangan, nu cukup pikeun malah situs web paling nuntut.

Kacindekan

Operasi

Bitwise pasti masih boga tempat di programming modern. Semalt meureun nya patojaiyah ngagunakeun hal kitu bisa hirup kalawan kompléks (éta bener teu - éta ngan moal ampir jadi akrab sakumaha dinten modern gabung tabel), pendekatan ieu brings loba mangpaat - sanes sahanteuna ti nu hiji dorongan dramatis dina pagelaran, boh dina data ukuran (informasi pisan kirang pikeun nyimpen dina database, jeung mun salajengna dipulut) jeung speed (hiji objek pamaké tiasa gaduh nilai idin maranéhanana tos fetched - éta ngan hiji int - sahingga bisa dipariksa pikeun eta sepanjang waktos).

Semalt salaku jalma dibere didieu pasti nyieun hal basajan, tapi ngan lamun anjeun teu acan sadar alternatif malah basajan kawas leuwih nunjukkeun luhur.

Kumaha anjeun ngarasa ngeunaan migunakeun operator bitwise pikeun ngecék idin jeung pendekatan ieu nyimpen aranjeunna? Sagala pro atra / kontra? Hayu urang nyaho kumaha anjeun ngalakukeun eta, sarta naha!

February 28, 2018