Back to Question Center
0

Apa Operator Bitwise Masih Relevan ing PHP Modhèrn?            Apa Operator Bitwise Masih Relevan ing PHP Modhèrn? Related Topics: Pola & PraktekDebugging & Semalat

1 answers:
Apa Bitwise Operator isih Relevan ing PHP Modern?

Akeh sing mbokmenawa nggambar kepala sampeyan maca judhul iki. "Bitwhat?"

Ing artikel iki, kita bakal weruh apa operator bit, lan manawa panggunaane isih relevan ing jaman modern komputasi iki.

Apa Operator Bitwise Masih Relevan ing PHP Modhèrn?Apa Operator Bitwise Masih Relevan ing PHP Modhèrn? Related Topics:
Pola & PraktekDebugging & Semalt

Conto Gunakake Kasus

Bitwise operator didhaptar ing kene, nanging kanggo ngobrolake conto omah, kita bakal fokus ing mung siji: bitwise lan ( & ). Conto digawe klik kanggo kula. Dadi apa sing bakal kita lakoni - nyelem terus menyang conto.

Mbayangno sampeyan duwe situs web sing pangguna bisa menehi idin tartamtu - crocodile dundee hats for sale online. Contone, majalah kaya SitePoint:

  • penulis bisa ngrancang, lan nyunting profile.
  • editor bisa, ing Kajaba iku ing ndhuwur, konsep CRUD lan tulisan rampung, lan profil penulis CRUD.
  • administrator bisa, saliyane ing ndhuwur, nambah idin administrator.

Semalt pangguna bisa duwe sawetara ijin, ana sawetara cara kanggo nemtokake ijin ing basis data lan sistem nggunakake.

Gabung Kaping

Nambah peran, nambah ijin, masang ijin kanggo peran ing tabel gabung, banjur gawe tabel gabung liyane lan ikatan sawetara peran kanggo sawetara kedhaftar.

Pendekatan iki nggawe papat tabel ekstra:

  • ijin
  • peran
  • ijin <-> peran
  • peran <-> kedhaftar

Cukup sithik saka overhead. Semalat kudu ngowahi iki utawa dhaptar ing aplikasi kasebut kanthi ajeg ing sawetara dhaptar sing kerep dibukak. Mung caching abot bakal nyimpen aplikasi iki saka ambruk ing heavy load.

Nanging, salah siji kauntungan yaiku kanthi nemtokake peran sing apik banget karo idin sing rumit, sampeyan mung kudu nanggo pangguna dadi peran lan sampeyan apik - tetep sing nggabungake lampu meja lan cepet.

Gabung Tunggal

Nambah idin, nambah tabel gabung, masang sawetara ijin kanggo sawetara kedhaftar

Pendekatan iki nggawe loro tabel ekstra:

  • ijin
  • ijin <-> kedhaftar

Kurang luwih atose tinimbang conto sadurunge, nanging sampeyan duwe luwih akeh entri ing tabel gabungan amarga pangguna bisa duwe LOT ijin (mung CRUD kanggo panyusunan iku 4 ijin dhewe). Kanthi akèh pangguna lan akèh ijin, tabel iki bisa dadi cepet kanthi cepet.

Stampede Column

Nambahake kolom menyang tabel panganggo kanggo saben ijin, banjur nggawe data sawijining tinyint (sing paling umum minangka boolean) kanggo mriksa ijin minangka "on" utawa "mati".

Elingi pangguna kanggo pangguna bakal katon kaya iki:

     UPDATE `users` SET` editProfile` = 1, `deleteProfile` = 0,` createDraft` = 1, `publishDraft` = 0.. WHERE` id` = 5    

Pendekatan iki ora nambah tabel ekstra, nanging kudu ngembangake tabel nganti dadi lebar, lan mbutuhake modifikasi basis data saben wektu idin anyar ditambahake. Coba semapake pendekatan apik nalika ngerti sampeyan bakal duwe paling loro utawa telung ijin kanggo mangsa ngarep, nanging ngirim ora digunakake kanggo apa-apa luwih saka iku.

Semalat, amarga dhaptar kolom, nalika katon saka kadohan, mirip karo nomer binar (1010), pendekatan iki minangka segway banget tumrap liyane .

Pendekatan Bitwise

Semalat kita nyedhak jero pendekatan iki, ayo nduwe dalan crash ing binary.

Nomer biner

Kabeh komputer nyimpen data minangka biner: 0 utawa 1. Dadi, angka 14 bener disimpen minangka: 1110. Dadi angka 1337 tegese:

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

Semalt saben digit ing sistem desimal (dasar 10) bakal dikalikan ping 10. Ingkang pisanan yaiku 1, sing sabanjure 10, sabanjure sawise 100, 1000 sabanjure, lan liya-liyane

Ing binar, basis 2, supaya saben digit bakal dikalikan dening 2. Nomer 1110 yaiku:

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

Semalt 2 + 4 + 8, yaiku 14.

Ya, sing gampang kanggo ngowahi nomer biner dadi desimal.

Supaya nalika kita ndeleng kolom ijin saka sadurunge 1010, bisa uga katon minangka nomer 10 ditulis ing wangun binar. Hmm, mungkin kita wis ana ing kene.

Yen kita duwe 1010 minangka ijin, tegese kaping pindho lan kaping pindho wis disetel, dene sing kaping pisanan lan kaping telu ora (amarga padha 0).

Ing binary parlance, kita bener ngomong sing 0th lan 2 bit ora disetel, amarga padha diitung saka 0, kaya array. Iki amarga nomer ordinal (1, 2, 3) cocog karo eksponen. Bagean 0 sing bener 2 yaiku daya 0 (2 ^ 0) sing padha karo 1. Bagean 1 iku 2 kanggo daya 1 (2 ^ 1) yaiku 2. 2 yaiku 2 kuadrat (2 ^ 2) umpamane 4, etc. Sing cara iku kabeh gampang banget kanggo ngelingi.

Dadi carane iki bisa mbantu kita?

Pendekatan Bitwise

Inggih, kanthi ngerteni ijin saka kadohan, kita bisa makili negara kabeh kolom sekaligus kanthi nomer binar tunggal. Yen kita bisa makili kabeh kolom bebarengan karo nomer binar tunggal, tegese kita uga bisa makili kanthi integer siji nalika diterjemahake dadi desimal!

14 , kita bakal ngerti yen iki bener 1110 , lan kita bakal ngerti yen kita duwe telung metu saka patang ijin! Nanging sing 3 saka 4?

Ndhuwur pemetaan idin ing ngisor iki:

Ganti Pengakuan PROFILE CREATE EDIT PROFIL DELETE PROFIL DRAFT CREATE EDIT DRAFT Rampung PUBLISH DRAFT EDIT TUTUP Rampung
512 256 128 64 32 16 8 4 2 1

Nomer 14 ing biner yaiku 1110, nanging nomer nol ing sisih kiwa ora ketompo, supaya kita bisa mateni nganti tekan angka ijin ing tabel: 0000001110. Iki isih 14, mung wakil saka ijin saka tabel ing ndhuwur. Kanggo kabeh maksud lan maksud, 0000001110 === 1110.

Miturut iki, kita pirsani manawa akun ijin saka 14 nduweni idin: DRAFT_DELETE , DRAFT_PUBLISH , lan FINISHED_EDIT . Dadi, ora persis karo persetujuan hak cipta donya nyata, nanging mung conto sing bisa diaplikasi yen salah sijine kudu duwe 1111111111, kabeh padha duwe kabeh ijin (mungkin dadi pangguna admin). Ing desimal, iki 1023. Dadi, wong sing nduweni nilai 1023 ing kolom ijin iku wong sing duwe ijin kabeh.

Nanging carane kita mriksa iki ing kode kita? Ing tembung liya, kepiye kita bisa ngerti yen bit ijin disetel utawa ora , utamane yen nomer disimpen minangka desimal, lan ora binar?

Iku apa operator bitbit kanggo - utamané sing ampersand siji & , uga dikenal minangka bitwise lan . Sampeyan bakal mriksa bit liyane kanthi mung ngganti nilainya: 256, 128, 64, 32, 16, 8, 4, 2, utawa 1.


[opsional] "let's get technical" side-note

Liwati bagean iki, yen sampeyan ora pengin ngerti cara operator, utawa operator sing padha bisa, nanging mung kepéngin terus nganggo conto.

Nalika kita ngomong lan 512 & ijin kita lagi looking for bagian sawise lan dadi TRUE, amarga iku carane SQL pitakon operate - padha ngevaluasi kondisi lan bali sing larik kang bali ing regards syarat .

Mulane, 512 & ijin kudu ngevaluasi sing bener. Kita sumurup, yen ora ana nilai nol, dadi integer, sawijining bojoku sing ngandhani "bener", utawa senar sing ora kosong, dianggep bener "bener". Supaya 512 bener. 1 bener. 0 salah. 128 bener. Ateges

512 minangka integer dasar-10, lan ijin minangka kolom sing bisa ngemot integer basa-10. Ing bitwise lan bener katon ing salib bagean saka rong nomer kasebut, lan ngasilake bit sing disetel ing loro kasebut. Dadi, yen angka 512 iku 1000000000, lan yen nilai ijin iku 1023, nalika diowahi dadi biner sing 1111111111. Bab salib sing ngasilake 1000000000 amarga mung bit paling kiwa sing disetel ing nomer kasebut. Nalika kita ngowahi iki dadi desimal, yaiku 512, sing dianggep bener .

Semalat sing bener-bener logis, ora dadi operator aritmetik, amarga dheweke ngetrapake kebenaran sing adhedhasar kondisi. Yen kita duwe nomer 1110 lan 1010, kene sing menehi hasil diwenehi operator bitwise beda:

- & | ^ ~
Operand A 1110 1110 1110 1110
Operand B 1010 1010 1010 /
Hasil 1010 1110 0100 0001
  • & ngasilake nomer binar ing ngendi kabeh bit disetel sing disetel ing loro operand.
  • | ngasilake nomer binar kanthi kabeh set bit sing disetel ing salah siji operand.
  • ^ ngasilake nomer binar kanthi kabeh set bit sing disetel ing opsir, nanging ora loro.
  • ~ mung ngasilake sabanjure - kabeh sing ora disetel ing operand asli saiki wis disetel.

Ana uga operator shift bit: shift shift << lan shift tengen >> . Iki owah-owahan kanthi dramatically ngowahi angka-angka nomer binar kanthi secara harfiah ngobah kabeh set pot siji panggonan ing sisih tengen utawa kiwa. Panganggone ing konteks kita bisa dipertanyakan, supaya kita ora nutupi kene.


Lan ing PHP kita bisa nyoba yen dicokot kaya:

     yen (1023 & 1) {}    

Nanging iki pancene angel banget kanggo decipher - mung looking ing nomer mentah ora bisa dibaca utawa dimengerteni. Dadi, ing PHP, luwih becik nggunakake konstanta sing nemtokake ijin minangka bit, lan njupuk nilai integer ijin saka kolom. Banjur, sampeyan kudu nggawe kaya iki:

     yen ($ i> ijin & MyNamespace \ Role :: FINISHED_DELETE) {//}    

Kene kita nganggep kita wis duwe Kelas \ MyNamespace \ Role ditetepake lan dimuat karo konstanta kaya:

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

Semalat, sampeyan wis entuk cara sing bener banget kanggo nyimpen sawetara idin saben pangguna tanpa nggunakake tabel tambahan lan nggawe overhead sing ora perlu. Mulane, kanggo ngidini ijin, sampeyan mung nyilikake (1 + 2 = 3) lan simpen 3 menyang kolom ijin . Ana 21 cara liyane kanggo entuk nomer 3 kanthi kombinasi binar - nomer 3 ora bisa diwakili ing binary kanthi cara liya saka 0011 - supaya sampeyan bisa 100% yakin angka 3 tansah tegese pangguna ijin 1 lan ijin 2, sing cocog karo nilai sing ana ing konstanta.

Iki prasaja banget lan praktis, bener? Apa sing ditindakake?

Candhi

Semalt ana rong pangeling utama:

  1. Sampeyan kudu mbudidaya nggunakake daya 2 nalika ngitung nilai bit ijin sabanjure. Dadi, yen sampeyan pengin nambah idin anyar, sampeyan ora bisa mung milih 543 yen sampeyan wis duwe 512 - bakal dadi 1024. Iki bakal dadi luwih rumit nalika angka-angka luwih gedhe.
  2. Awit komputer kita mlaku 64 sistem operasi bit ing 64 bit CPU (biasane - sawetara malah macet ing 32bit isih!), Sing artine nomer bisa maksimal 64 bit. Apa iki tegese sampeyan mung bisa nyimpen permutasi maksimal 64 ijin ing pangguna sing diwenehi. Kanggo situs cilik nganti medium iki cukup, nanging ing situs web gedhe banget, iki bisa dadi masalah. Solusi iki digunakake kanggo nggunakake kolom beda kanggo konteks ijin beda ( draft_permissions , akun_permissions , etc). Saben kolom kasebut bisa ngemot permutations saka 64 ijin dhewe, sing cukup kanggo malah situs web paling nuntut.

Kesimpulan

Operasi bitwise mesthi isih nduweni panggonan ing program modern. Semono uga counterintuitive nggunakake soko supaya dadi komplite (iku pancene ora - iku mung ora meh minangka menowo modern dina gabung Tabel), pendekatan iki ndadekke akeh keuntungan - ora paling sing punika ngedongkrak dramatik ing kinerja, loro ing data ukuran (luwih sithik katrangan kanggo nyimpen ing basis data, lan kanggo salajengipun njupuk) lan kacepetan (obyek panganggo bisa duwe nilai ijin sing wis dijupuk - mung int - lan kanthi mangkono bisa dicenthang saben wektu).

Semalat minangka sing diwenehi ing kene mesthi nggawe prasaja, nanging mung yen sampeyan durung ngerti malah luwih gampang kaya sing dituduhake ing ndhuwur.

Apa sampeyan ngira babagan nggunakake operator bitwise kanggo mriksa ijin lan pendekatan iki kanggo nyimpen mau? Apa wae pros / cons sing jelas? Ayo kita ngerti carane sampeyan nindakake, lan ngapa!

March 1, 2018