Kursy mojej produkcji

1.9 Operatory bitowe

Operatory bitowe są dość rzadko spotykane ze względu na ich specyfikę jednak warto je omówić. Operatory te pozwalają na przeprowadzanie operacji logicznych na bitach. W praktyce przydaje się to osobom, które zajmują się np. elektroniką. W PHP praktycznie nie znajdują zastosowania. Operacje logiczne opierają się na prawach algebry Boole'a. Bramki logiczne są najczęściej spotykanym elementem, w którym stosuje się algebrę Boole'a. Jako ciekawostkę powiem, że każdy procesor jest wyposażony w jednostki arytmetyczno-logiczna, które także umożliwiają przeprowadzanie operacji logicznych. Aby dalej nie mieszać poniżej przedstawiam przykłady zastosowania operatorów bitowych. Chce także zwrócić uwagę, że podczas zmiany typu zmiennej z int na bool wartość 0 przybiera postać false oraz wartość 1 przybiera postać true.

Lista operatorów bitowych

  • $a & $b czyli bitowe AND
  • $a | $b czyli bitowe OR
  • !$a czyli bitowe NOT
  • $a ^ $b czyli bitowe XOR
  • $a << $b czyli bitowe przesuniecie bitów w lewo
  • $a >> $b czyli bitowe przesuniecie bitów w prawo

Przykłady zastosowań

Bitowe AND

Kod:
<?php
// Tablica prawdy dla operacji AND

#---+---+---+
# a | b | q |
#---+---+---+
# 0 | 0 | 0 |
# 0 | 1 | 0 |
# 1 | 0 | 0 |
# 1 | 1 | 1 |
#-----------+

$a 1// true
$b 1// true

echo $a $b// Czyli wszystkie argumenty muszą mieć wartość 1 aby wyszła prawda
?>

Bitowe OR

Kod:
<?php
// Tablica prawdy dla operacji OR

#---+---+---+
# a | b | q |
#---+---+---+
# 0 | 0 | 0 |
# 0 | 1 | 1 |
# 1 | 0 | 1 |
# 1 | 1 | 1 |
#-----------+

$a 0// false
$b 1// true

echo $a $b// Czyli wystarczy, że jeden argument przybierze wartość 1 i wychodzi prawda
?>

Bitowe NOT

Kod:
<?php
// Tablica prawdy dla operacji NOT

#---+---+
# a | q |
#---+---+
# 0 | 1 |
# 1 | 0 |
#-------+

$a 0// false

echo !$a;
?>

Bitowe XOR

Kod:
<?php
// Tablica prawdy dla operacji XOR

#---+---+---+
# a | b | q |
#---+---+---+
# 0 | 0 | 0 |
# 0 | 1 | 1 |
# 1 | 0 | 1 |
# 1 | 1 | 0 |
#-----------+

$a 1// true
$b 1// true

echo $a $b;
?>

Bitowe przesunięcie w lewo

Kod:
<?php
$a 1;
$b 10;

// Przesuwany $a w lewo o $b bitów
echo $a << $b// 1024
?>

Bitowe przesunięcie w prawo

Kod:
<?php
$a 1024;
$b 4;

// Przesuwany $a w prawo o $b bitów
echo $a >> $b// 64
?>

Bitowe NOR

Kod:
<?php
// Tablica prawdy dla operacji NOR

#---+---+---+
# a | b | q |
#---+---+---+
# 0 | 0 | 1 |
# 0 | 1 | 0 |
# 1 | 0 | 0 |
# 1 | 1 | 0 |
#-----------+

$a 0// false
$b 0// false

echo !($a $b);
?>

Bitowe NAND

Kod:
<?php
// Tablica prawdy dla operacji NAND

#---+---+---+
# a | b | q |
#---+---+---+
# 0 | 0 | 1 |
# 0 | 1 | 1 |
# 1 | 0 | 1 |
# 1 | 1 | 0 |
#-----------+

$a 0// false
$b 0// false

echo !($a $b);
?>

Bitowe ENOR (XNOR)

Kod:
<?php
// Tablica prawdy dla operacji ENOR (XNOR)

#---+---+---+
# a | b | q |
#---+---+---+
# 0 | 0 | 1 |
# 0 | 1 | 0 |
# 1 | 0 | 0 |
# 1 | 1 | 1 |
#-----------+

$a 0// false
$b 0// false

echo !($a $b);
?>

Inne

Kod:
<?php
$a 0// false
$b 0// false
$c 0// false
$d 1// true

echo $a $b $c $d// Wystarczy, że którakolwiek ze zmiennych przyjmie wartość 1 wtedy na wyjściu będzie 1
?>
Kod:
<?php
$a 1// true

echo (!(!$a)); // Podwójna negacja
?>
Zapewne zauważyliście podczas eksperymentów, że w momencie kiedy wynik powinien wynosić 0 (false) wtedy nic nie wyświetla się. Dzieje się tak ponieważ wynik jest typem boolean o wartości false. Aby obejść ten problem trzeba użyć innej funkcji do wyrzucania danych.

Dla osób zainteresowanych tematyka polecam analizę działania skryptu, który wykonałem na potrzeby edukacyjne. Ów informacje znajdują się w artykule pod tytułem Rysowanie przebiegów czasowych bramek logicznych.