ბიტური ოპერატორების გამოყენება არცთუ ხშირად გვიწევს მაგრამ არის შემთხვევები როდესაც მათი გამოყენება შეიძლება სასარგებლო და ხშირ შემთხვევაში საუკეთესო გამოსავალიც კი იყოს. PHP აღჭურვილია შესაბამისი ოპერატორებით რომლებიც შეიძლება გამოვიყენოთ ბიტური ოპერაციების ჩატარებისათვის.
პირველ რიგში მართებული იქნება თუ მიმოვიხილავთ ბაიტებსა და ბიტებს. ცნობილია რომ ბაიტი შედგება რვა(8) ბიტისაგან, ბიტს თავისთავად შეიძლება გააჩნდეს მხოლოდ ორი მნიშვნელობა 1(ერთი) ან 0(ნული). თუ ბიტის მნიშვნელობა უდრის 1 – ს ეს ნიშნავს რომ ბიტი მონიშნულია ხოლო თუ მისი მნიშვნელობა უდროს 0 – ს ეს ავტომატურად ნიშნავს რომ ბიტი არ არის მონიშნული. ბაიტის მაქსიმალური მნიშვნელობა განისაზღვრება 255 – ით, ანუ თუ ბაიტის შემადგენილი ყველა ბიტი არის მონიშნული ბაიტის მნიშვნელობა იქნება 255.
ბატი ვიზუალურად შეიძლება გამოვსახოთ შემდეგი ცხრილის სახით:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
სადაც “ბიტის ინდექსი” ასახავს ბიტის პოზიციას ბაიტში(ინდექსაცია იწყება 0 – იდან). ხოლოდ “ბიტის მნიშნვნელობა” კონკრეტულ პოზიციაზე ბიტის შესაძლო მნიშვნელობას თუ იგი მონიშნულია(ანუ უდრის 1 – ს).
როგორც ზემოთ ავღნიშნე თუ ბაიტის შემადგენელი ყველა ბიტი არის მონიშნული მაშინ ბაიტის მნიშვნელობა იქნება 255 – ის ტოლი, რაც ვიზუალურად გამოსახულია შემდეგ ცხრილში:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | = | 255 | |
ცხრილის მესამე სტრიქონში ყველა ველში მითითებულია 1, რაც ნიშნავს რომ იგივე პოზიციაზე არსებული ბიტი არის მონიშნული, ხოლო რეზულტატი უდრის 255 – ს. როგორ მივიღეთ ეს რეზულტატი? რადგან ყველა ბიტი მონიშნულია ამის საფუძველზე შეგვიძლია დავწეროთ შემდეგი მარტივი არითმეტიკული გამოსახულება:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
აქედან შეგვიძლია გავაკეთოთ დასკვნა, რომ თუ ბაიტის ბიტი ან ბიტები არის მონიშნული მათი შესაბამისი მნიშვნელობების დაჯამებით მივიღებთ ბაიტის ზუსტ მნიშვნელობას.
გამომდინარე აქედან შეგვიძლია გამოვითვალოთ მაგალითად რიცხვი 36:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | = | 36 | |
რატომ არის ამ გამოსახულების რეზულტატი 36 – ის ტოლი? რადგან ცხრილში ნაჩვენებია რომ მოვნიშნეთ მხოლოდ ორი ბიტი, სადაც ერთი ბიტის მნიშნელობა არის 32(პოზიცია ინდექსით 5) ხოლო მეორე ბიტის მნიშვნელობა კი 4(პოზიცია ინდექსით 2) შეგვიძლია დავწეროთ ასეთი გამოსახულება:
32 + 4 = 36
თუ რა საშუალებებს გვთავაზობს ბიტური ოპერაციების განსახორციელებლად PHP, დეტალური ინფორმაცია შეგიძლიათ იხილოთ შესაბამის მისამართზე.
PHP-ს ბიტური ოპერატორები
შემდეგ ცხრილში მოცემულია ოპერატორების ცხრილი შესაბამისი განმარტებებით:
| მაგალითი | დასახელება | რეზულტატი |
|---|---|---|
| $a & $b | And | ბიტები რომლებიც მონიშნულია(და საერთოა) ორივე $a და $b ცვლადებში. |
| $a | $b | Or | ბიტები რომლებიც მონიშნულია ან $a ან $b ცვლადებში. |
| $a ^ $b | Xor | ბიტები რომლებიც მონიშნულია ან $a ცვლადში ან $b ცვლადში მაგრამ არა ორივეში. |
| ~ $a | Not | ბიტები რომლებიც არ არის მონიშნული $a ცვლადში, და პირიქით. |
| $a << $b | Shift left | $a ცვლადის ბიტების წაძვრა $b ბიჯით მარცხნივ(ყოველი ბიჯი ნიშნავს “გაამრავლზე ორზე”) |
| $a >> $b | Shift right | $a ცვლადის ბიტების წაძვრა $b ბიჯით მარჯვნი (ყოველი ბიჯი ნიშნავს “გაყავი ორზე”) |
განვიხილოთ ცხრილში მოცემული ყველა ოპერატორი:
AND(&) ოპერატორი
& ოპერატორი აბრუნებს გამოსახულების მარცხენა და მარჯვენა მხარეს არსებული მნიშვნელობების იმ ბიტების ჯამს რომლებიც საერთოა ორივესთვის, მაგალითად შემდეგ კოდის შესრულების შემდეგ ეკრანზე გამოიბეჭდება 6:
1 2 3 4 | $a = 7; $b = 6; echo $a & $b; |
თუ რატომ არის ამ გამოსახულების შედეგი 6 – ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $a | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | = | 7 (ანუ: 4+2+1) |
| $b | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | = | 6 (ანუ: 4+2) |
ცხრილში შეგვიძლია ვიზუალურად დავინახოთ რომ $a და $b ცვლადებს აქვთ მონიშნული საერთო ბიტები პოზიციებზე ინდექსით 1 და 2, რადგან მოცემულ პოზიციებზე ბიტების მნიშვნელობებია შესაბამისად 4 და 2 ამ რიცხვების ჯამი იქნება 6: 4+2 = 6
OR(|) ოპერატორი
| ოპერატორი აბრუნებს გამოსახულების მარცხენა და მარჯვენა მხარეს არსებული მნიშვნელობების იმ ბიტების ჯამს რომლებიც მონიშნულია ან მარცხენა ან მარჯვენა ოპერანდში, მაგალითად შემდეგ კოდის შესრულების შემდეგ ეკრანზე გამოიბეჭდება 15:
1 2 3 4 | $a = 11; $b = 6; echo $a | $b; |
თუ რატომ არის ამ გამოსახულების შედეგი 15 – ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $a | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | = | 11 (ანუ: 8+2+1) |
| $b | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | = | 6 (ანუ: 4+2) |
ცხრილიდან ჩანს რომ ორივე $a და $b ცვლადებისათვის ბიტები მონიშნულია ინდექსებზე 0, 1, 2 და 3 ხოლო ამ პოზიციებზე არსებული მნიშვნელობების დაჯამებით მივიღებთ 15-ს: 8+4+2+1=15
XOR(^) ოპერატორი
^ ოპერატორი აბრუნებს გამოსახულების მარცხენა და მარჯვენა მხარეს არსებული მნიშვნელობების იმ ბიტების ჯამს რომლებიც მონიშნულია ან მარცხენა ან მარჯვენა ოპერანდში მაგრამ არა ორივეში, მაგალითად შემდეგ კოდის შესრულების შემდეგ ეკრანზე გამოიბეჭდება 13:
1 2 3 4 | $a = 11; $b = 6; echo $a ^ $b; |
თუ რატომ არის ამ გამოსახულების შედეგი 13-ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $a | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | = | 11 (ანუ: 8+2+1) |
| $b | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | = | 6 (ანუ: 4+2) |
ამ შემთხვევაში $a ცვლადისათვის ისეთი ბიტები რომლებიც არ არის მონიშნული $b ცვლადში გვხვდება პოზიციებზე ინდექსებით 3 და 1, ხოლო $b ცვლადისათვის ასეთი ბიტი მდებარეობს პოზიციაზე ინდექსით 2. თუ დავაჯამებთ ამ პოზიციების შესაბამის მნიშვნელობებს მივიღებთ 13-ს: 8+4+1=13
NOT(~) ოპერატორი
თუ შევასრულებთ შემდეგ კოდს რომელშიც გამოიყენება ~ ოპერატორი, ეკრანზე გამოიბეჭდება 9:
1 2 3 4 | $a = 11; $b = 6; echo $a & ~$b; |
თუ რატომ არის ამ გამოსახულების შედეგი 9 – ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $a | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | = | 11 (ანუ: 8+2+1) |
| $b | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | = | 6 (ანუ: 4+2) |
რადგან $a & ~$b გამოსახულებაში ~ გამოიყენება $b-სთან, იგი შეგვიძლია განვმარტოთ შემდეგნაირად: დააბრუნე $a ცვლადის იმ ბიტების ჯამი რომლებიც არ არის მონიშნული $b ცვლადში. ხოლო როგორც ცხრილიდან ჩანს $a ცვლადისათვის ასეთი ბიტები გვხვდება პოზიციებზე ინდექსით 3 და ინდექსით 0, შედეგად 8+1=9
<< ოპერატორი, მარცხნივ წაძვრის ოპერატორი
მაგალითისათვის შევასრულოთ შემდეგი კოდი:
1 2 3 | $a = 4; echo $a << 3; |
კოდის შესრულების შედეგი იქნება 32. ბიტების ცხრილის გამოყენებით ადვილად შეგვიძლია ამის დადგენა:
| 1 ბაიტი (8 ბიტი) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ბიტის ინდექსი | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
| ბიტის მნიშვნელობა | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $a – საწყისი | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | = | 4 |
| $a – წაძვრის შემდეგ | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | = | 32 |
ცხრილიდან $a – ს საწყისი და საბოლოო შედეგების შედარებისას ნათელია რომ << მეშვეობით მონიშნული ბიტი წავძარით მარცხნივ სამი(3) ბიჯით, გამომდინარე შედეგინდან, რათა უფრო მარტივი გასაგები გახდეს $a <<3 გამოსახულება შეიძლება ავსახოთ შემდეგნაირად: 4*2*2*2=32
>> ოპერატორი, მარჯვნივ წაძვრის ოპერატორი
ეს ოპერატორი მუშაობს წინა ოპერატორის მსგავსად მხოლოდ ბიტების წაძვრა ხდება მარცხნიდან მარჯვნივ, მაგალითად შემდეგი კოდის შესრულებით შედეგად მივიღებთ 4-ს:
1 2 3 | $a = 32; echo $a >> 3; |
ხოლო $a >> 3 ამ გამოსახულების გადაწერა შეიძლება შემდეგნაირად: 32/2/2/2=4
ტეგები: PHP
სტატია ძალიან მომეწონა, ბავშვობა გამახსენდა როცა ესეთ რამეებს ვსწავლობდი. ეს ყველაფერს რაც ერთ გვერდზე მშვენივრად დაეტია მთელი სემესტრი გვსაწავლიდნენ
რა მაინტერესებს, შენ თუ გამოგიყენებია ეს ოპერაციები და თუ შეგიძლია მათი პრაქტიკული გამოყენების კონკრეტული მაგალითები რო მითხრა.