Bitsel İşleçler

Bitsel işleçler, bir tamsayının içindeki belli bitleri 0 ya da 1 yaparlar.

Bitsel İşleçler
ÖrnekİsimSonuç
$a & $bVeHem $a hem de $b'de 1 olan bitler sonuçta 1 yapılır.
$a | $bVeya$a veya $b'de 1 olan bitler sonuçta 1 yapılır.
$a ^ $bAyrıcalıklı Veya Hem $a hem de $b'de 0 veya 1 olan bitler sonuçta 0, diğerleri 1 yapılır.
~ $aDeğil$a'nın 0 olan bitleri 1, 1 olanları 0 yapılır.
$a << $bSola kaydırma$a'nın bitleri $b adım sola kaydırılır (her adım ikiyle çarpma işlemine denktir).
$a >> $bSağa kaydırma$a'nın bitleri $b adım sağa kaydırılır (her adım ikiye bölme işlemine denktir).

PHP'de bit kaydırma bir aritmetik işlemdir. Kaydırma sonucu her iki uçtan da taşan bitler silinir. Sola kaydırmada sağdan eksilen bitler sıfırlarla doldurulur, bu arada işaret biti soldan taşarak silinir, yani sola kaydırmada terimin işareti korunmaz. Sağa kaldırmada ise işaret biti yerinden oynatılmaz, yani sağa kaydırmada terimin işareti korunur.

Bir işlemin öncelik alması gerekiyorsa yaylı ayraçlar kullanılmalıdır. Örneğin, $a & $b == true işleminde önce eşitlik sonra bitsel VE uygulanırken ($a & $b) == true işleminde ise önce bitsel VE sonra eşitlik uygulanır.

Eğer &, | ve ^ için her iki terim de dize ise terimlerdeki karakterlerin ASCII değerleri üzerinde işlem yapılır ve sonuç bir dize olur. Tüm diğer durumlarda, her iki terim tamsayıya dönüştürülür ve sonuç tamsayı olur.

~ işleci için terim bir dize ise, terimdeki karakterlerin ASCII değerleri üzerinde işlem yapılır ve sonuç bir dize olur. Aksi takdirde, terim ve sonuç tamsayı olarak ele alınır.

<< ve >> işleçleri için her iki terim ve sonuç daima tamsayı olarak ele alınır.

 PHP'nin error_reporting yönergesi gerçekte neler olup bittiğini göstermek için bitsel değerler kullanır. Sadece bilgilendirmeleri değil hataların tümünü görmek için php.ini dosyasında ilgili yere şu yazılabilir: E_ALL & ~E_NOTICE

 Bu E_ALL için şöyle çalışır: 00000000000000000111011111111111 Keza E_NOTICE... 00000000000000000000000000001000 ... ve ~ ile ters çevrilerek: 11111111111111111111111111110111 Son olarak, her iki değer üzerinde etkin bitleri bulmak için VE (&) işlecini kullanır: 00000000000000000111011111110111

 Bunu sağlamanın bir başka yolu da sadece bir değerde veya diğerinde etkin bitleri bulmak için XOR (^) kullanmaktır: E_ALL ^ E_NOTICE

 error_reporting yönergesi bitleri etkin kılmayı göstermek için de kullanılabilir. Sadece hataları ve kurtarılabilir göstermenin yolu: E_ERROR | E_RECOVERABLE_ERROR

 Bu işlem etkin bitleri almak için 00000000000000000000000000000001 ve 00000000000000000001000000000000 E_ERROR'ları üzerinde VEYA (|) işlecini kullanır: 00000000000000000001000000000001

Örnek 1 - Tamsayılar üzerinde bitsel işlemler

<?php


$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";

echo <<<EOH
--------- --------- -- ---------
sonuç değer işl dnm
--------- --------- -- ---------
EOH;




$değerler = array(0, 1, 2, 4, 8);
$dnm = 1 + 4;

echo
"\n Bitsel VE \n";
foreach (
$değerler as $değer) {
$sonuç = $değer & $dnm;
printf($format, $sonuç, $değer, '&', $dnm);
}

echo
"\n Bitsel Ayrıcalıklı VEYA \n";
foreach (
$değerler as $değer) {
$sonuç = $değer | $dnm;
printf($format, $sonuç, $değer, '|', $dnm);
}

echo
"\n Bitsel Ayrıcalıklı VEYA (XOR) \n";
foreach (
$değerler as $değer) {
$sonuç = $değer ^ $dnm;
printf($format, $sonuç, $değer, '^', $dnm);
}
?>

Yukarıdaki örneğin çıktısı:

 --------- --------- -- --------- sonuç değer işl dnm --------- --------- -- --------- Bitsel VE ( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) Bitsel Ayrıcalıklı VEYA ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitsel Ayrıcalıklı VEYA (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101) 

Örnek 2 - Dizgeler üzerinde bitsel işlemler

<?php
echo 12 ^ 9; // '5' çıktılar

echo "12" ^ "9"; // Gerisilme karakterini çıktılar (ASCII 8)

Örnek 3 - Tamsayılarda bit kaydırma

<?php


echo "\n--- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA ---\n";

$dgr = 4;
$hane = 1;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'işaret bitinin kopyası sola kaydırıldı');

$dgr = 4;
$hane = 2;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane);

$dgr = 4;
$hane = 3;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'bitler sağa kaydırıldı');

$dgr = 4;
$hane = 4;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'yukarıdakiyle aynı; 0\'dan sonrası kaydırılamaz');


echo
"\n--- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA ---\n";

$dgr = -4;
$hane = 1;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'işaret bitinin kopyası sola kaydırıldı');

$dgr = -4;
$hane = 2;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'bitler sağa kaydırıldı');

$dgr = -4;
$hane = 3;
$snç = $dgr >> $hane;
p($snç, $dgr, '>>', $hane, 'yukarıdakiyle aynı; -1\'dan sonrası kaydırılamaz');


echo
"\n--- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA ---\n";

$dgr = 4;
$hane = 1;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'sağ taraf sıfırlarla doldurulur');

$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 4;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane);

$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 3;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'işaret bitleri dışa kaydırılır');

$dgr = 4;
$hane = (PHP_INT_SIZE * 8) - 2;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'bitler sola kaydırıldı');


echo
"\n--- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA ---\n";

$dgr = -4;
$hane = 1;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'sağ taraf sıfırlarla doldurulur');

$dgr = -4;
$hane = (PHP_INT_SIZE * 8) - 3;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane);

$dgr = -4;
$hane = (PHP_INT_SIZE * 8) - 2;
$snç = $dgr << $hane;
p($snç, $dgr, '<<', $hane, 'işaret biti dahil, bitler soldan dışa kaydırıldı');




function p($snç, $dgr, $op, $hane, $ilt = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";

printf("İfade: %d = %d %s %d\n", $snç, $dgr, $op, $hane);

echo
" Onluk:\n";
printf(" değer=%d\n", $dgr);
printf(" sonuç=%d\n", $snç);

echo
" İkilik:\n";
printf(' değer=' . $format, $dgr);
printf(' sonuç=' . $format, $snç);

if (
$ilt) {
echo
" DİKKAT: $ilt\n";
}

echo
"\n";
}
?>

Yukarıdaki örneğin 32 bitlik makinelerdeki çıktısı:

 --- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: 2 = 4 >> 1 Onluk: değer=4 sonuç=2 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000010 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: 1 = 4 >> 2 Onluk: değer=4 sonuç=1 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000001 İfade: 0 = 4 >> 3 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: bitler sağa kaydırıldı İfade: 0 = 4 >> 4 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: yukarıdakiyle aynı; 0'dan sonrası kaydırılamaz --- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: -2 = -4 >> 1 Onluk: değer=-4 sonuç=-2 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111110 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: -1 = -4 >> 2 Onluk: değer=-4 sonuç=-1 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111111 DİKKAT: bitler sağa kaydırıldı İfade: -1 = -4 >> 3 Onluk: değer=-4 sonuç=-1 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111111 DİKKAT: yukarıdakiyle aynı; -1'dan sonrası kaydırılamaz --- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: 8 = 4 << 1 Onluk: değer=4 sonuç=8 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000001000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: 4611686018427387904 = 4 << 60 Onluk: değer=4 sonuç=4611686018427387904 İkilik: değer=000000000000000000000000000100 sonuç=010000000000000000000000000000 İfade: -9223372036854775808 = 4 << 61 Onluk: değer=4 sonuç=-9223372036854775808 İkilik: değer=000000000000000000000000000100 sonuç=100000000000000000000000000000 DİKKAT: işaret bitleri dışa kaydırılır İfade: 0 = 4 << 62 Onluk: değer=4 sonuç=0 İkilik: değer=000000000000000000000000000100 sonuç=000000000000000000000000000000 DİKKAT: bitler sola kaydırıldı --- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: -8 = -4 << 1 Onluk: değer=-4 sonuç=-8 İkilik: değer=111111111111111111111111111100 sonuç=111111111111111111111111111000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: -9223372036854775808 = -4 << 61 Onluk: değer=-4 sonuç=-9223372036854775808 İkilik: değer=111111111111111111111111111100 sonuç=100000000000000000000000000000 İfade: 0 = -4 << 62 Onluk: değer=-4 sonuç=0 İkilik: değer=111111111111111111111111111100 sonuç=000000000000000000000000000000 DİKKAT: işaret biti dahil, bitler soldan dışa kaydırıldı 

Yukarıdaki örneğin 64 bitlik makinelerdeki çıktısı:

 --- POZİTİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: 2 = 4 >> 1 Onluk: değer=4 sonuç=2 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000010 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: 1 = 4 >> 2 Onluk: değer=4 sonuç=1 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000001 İfade: 0 = 4 >> 3 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: bitler sağa kaydırıldı İfade: 0 = 4 >> 4 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: yukarıdakiyle aynı; 0'dan sonrası kaydırılamaz --- NEGATİF TAMSAYILARDA SAĞA BİT KAYDIRMA --- İfade: -2 = -4 >> 1 Onluk: değer=-4 sonuç=-2 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111110 DİKKAT: işaret bitinin kopyası sola kaydırıldı İfade: -1 = -4 >> 2 Onluk: değer=-4 sonuç=-1 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111111 DİKKAT: bitler sağa kaydırıldı İfade: -1 = -4 >> 3 Onluk: değer=-4 sonuç=-1 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111111 DİKKAT: yukarıdakiyle aynı; -1'dan sonrası kaydırılamaz --- POZİTİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: 8 = 4 << 1 Onluk: değer=4 sonuç=8 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000001000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: 4611686018427387904 = 4 << 60 Onluk: değer=4 sonuç=4611686018427387904 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0100000000000000000000000000000000000000000000000000000000000000 İfade: -9223372036854775808 = 4 << 61 Onluk: değer=4 sonuç=-9223372036854775808 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=1000000000000000000000000000000000000000000000000000000000000000 DİKKAT: işaret bitleri dışa kaydırılır İfade: 0 = 4 << 62 Onluk: değer=4 sonuç=0 İkilik: değer=0000000000000000000000000000000000000000000000000000000000000100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: bitler sola kaydırıldı --- NEGATİF TAMSAYILARDA SOLA BİT KAYDIRMA --- İfade: -8 = -4 << 1 Onluk: değer=-4 sonuç=-8 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1111111111111111111111111111111111111111111111111111111111111000 DİKKAT: sağ taraf sıfırlarla doldurulur İfade: -9223372036854775808 = -4 << 61 Onluk: değer=-4 sonuç=-9223372036854775808 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=1000000000000000000000000000000000000000000000000000000000000000 İfade: 0 = -4 << 62 Onluk: değer=-4 sonuç=0 İkilik: değer=1111111111111111111111111111111111111111111111111111111111111100 sonuç=0000000000000000000000000000000000000000000000000000000000000000 DİKKAT: işaret biti dahil, bitler soldan dışa kaydırıldı 
Uyarı

PHP_INT_MAX'ın ötesindeki sayılar üzerinde bitsel işlemler için gmp eklentisindeki işlevler kullanılmalıdır.

To Top