Primasaja.com: Service WEB, MOBILE & SOFTWARE DEVELOPMENT , ENGINEERING & ARCHITECTURE , DESIGN & CREATIVE , ADMIN SUPPORT , SALES & MARKETING , INSTALASI JARINGAN & KOMPUTER
Email: jakaprima123@gmail.com
Phone: 081311086653
Fax: -
Url:
cash, credit card
Perum Griya Rajeg Lestari Blok C No 24
Tangerang indonesia 15540

Tutorial PHP Operator Bitwise dan Operator Perbandingan

0
jaka prima maulana
www.primasaja.com -

Bitwise operator 

bitwise operator mengijinkan evaluasi dan manipulasi dari spesifik bit dengan integer, menangani bilangan biner.

contoh And = $a & $b; bit yang terset keduanya baik $a dan $b

contoh Or = $a | $b; bit yang terset antara $a atau $b

contoh Xor = $a ^ $b bit yang terset dalam $a dan $b tetapi tidak keduanya terset.

contoh Not = ~ $a  bit yang terset dalam $a tidak terset, atau sebaliknya

contoh shift left = $a << $b langkah shift/pertukaran bit dari $a $b ke kiri (setiap step dikali 2)

contoh shift right = $a >> $b step ke kanan (setiap step maksunya "dibagi 2")


pergeseran bit dalam PHP adalah aritmatika. pergeseran bit dari kedua ujung dibuang. shift kiri punya 0 shifted dalam kanan ketika tanda bit telah terputar keluar dari kiri, ini berati tanda dari opreant belum dilayani. shift kanan punya copy dari tanda bit yang bergeser dalam di kiri, berati pertanda dari operand dilayani.


gunakan kurung untuk yakin desired precedence / prioritas yang diinginkan. sebagai contoh $a & $b == true evaluasi sama dengan bitwise and; ketika ($a & b) == true evaluasi bitwise dan lalu di samakan.

jika kedua operand untuk &, | dan ^ operator adalah string, lalu operasi akan perform dalam ASCII value dari karakter yang membuat string dan hasilnya akan menjadi string. dalam semua kasus lain, kedua operand akan terkonvert ke integer dan hasilnya akan integer.


jika operand untuk operator (~) adalah string, operasi akan bekerja pada ASCII value dari karakter yang membuat string dan hasilnya akan menjadi string, lainnya operand dan hasilnya akan menjadi integer.


kedua operand dan hasil untuk (<<) dan (>>) operator selalu integer.


Contoh operasi Bitwise AND, OR dan XOR dalam integer


<?php

/*

 * abaikan maksud koding ini cuma buat membuat format terlihat jelas

 */


$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'

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


echo <<<EOH

 ---------     ---------  -- ---------

 result        value      op test

 ---------     ---------  -- ---------

EOH;


/*

 * abaikan maksud koding ini cuma buat membuat format terlihat jelas

 */


    /*

     * ini contohnya

     */


    $values = array(0, 1, 2, 4, 8);

    $test = 1 + 4;


    echo "\n Bitwise AND \n";

    foreach ($values as $value) {

        $result = $value & $test;

        printf($format, $result, $value, '&', $test);

    }


    echo "\n Bitwise Inclusive OR \n";

    foreach ($values as $value) {

        $result = $value | $test;

        printf($format, $result, $value, '|', $test);

    }


    echo "\n Bitwise Exclusive OR (XOR) \n";

    foreach ($values as $value) {

        $result = $value ^ $test;

        printf($format, $result, $value, '^', $test);

    }

?>



---------     ---------  -- ---------

 result        value      op test

 ---------     ---------  -- ---------

 Bitwise AND

( 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)


 Bitwise Inclusive OR

( 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)


 Bitwise Exclusive OR (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)











Contoh Bitwise XOR operasi di string


<?php

echo 12 ^ 9; // Outputs '5'


echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)

                 // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8


echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0

                        // 'a' ^ 'e' = #4


echo 2 ^ "3"; // Outputs 1

              // 2 ^ ((int)"3") == 1


echo "2" ^ 3; // Outputs 1

              // ((int)"2") ^ 3 == 1

?>


Contoh Bit Shifting di integer


<?php

/*

 * Here are the examples.

 */


echo "\n--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---\n";


$val = 4;

$places = 1;

$res = $val >> $places;

p($res, $val, '>>', $places, 'copy of sign bit shifted into left side');


$val = 4;

$places = 2;

$res = $val >> $places;

p($res, $val, '>>', $places);


$val = 4;

$places = 3;

$res = $val >> $places;

p($res, $val, '>>', $places, 'bits shift out right side');


$val = 4;

$places = 4;

$res = $val >> $places;

p($res, $val, '>>', $places, 'same result as above; can not shift beyond 0');



echo "\n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---\n";


$val = -4;

$places = 1;

$res = $val >> $places;

p($res, $val, '>>', $places, 'copy of sign bit shifted into left side');


$val = -4;

$places = 2;

$res = $val >> $places;

p($res, $val, '>>', $places, 'bits shift out right side');


$val = -4;

$places = 3;

$res = $val >> $places;

p($res, $val, '>>', $places, 'same result as above; can not shift beyond -1');



echo "\n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---\n";


$val = 4;

$places = 1;

$res = $val << $places;

p($res, $val, '<<', $places, 'zeros fill in right side');


$val = 4;

$places = (PHP_INT_SIZE * 8) - 4;

$res = $val << $places;

p($res, $val, '<<', $places);


$val = 4;

$places = (PHP_INT_SIZE * 8) - 3;

$res = $val << $places;

p($res, $val, '<<', $places, 'sign bits get shifted out');


$val = 4;

$places = (PHP_INT_SIZE * 8) - 2;

$res = $val << $places;

p($res, $val, '<<', $places, 'bits shift out left side');



echo "\n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---\n";


$val = -4;

$places = 1;

$res = $val << $places;

p($res, $val, '<<', $places, 'zeros fill in right side');


$val = -4;

$places = (PHP_INT_SIZE * 8) - 3;

$res = $val << $places;

p($res, $val, '<<', $places);


$val = -4;

$places = (PHP_INT_SIZE * 8) - 2;

$res = $val << $places;

p($res, $val, '<<', $places, 'bits shift out left side, including sign bit');



/*

 * Ignore this bottom section,

 * it is just formatting to make output clearer.

 */


function p($res, $val, $op, $places, $note = '') {

    $format = '%0' . (PHP_INT_SIZE * 8) . "b\n";


    printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places);


    echo " Decimal:\n";

    printf("  val=%d\n", $val);

    printf("  res=%d\n", $res);


    echo " Binary:\n";

    printf('  val=' . $format, $val);

    printf('  res=' . $format, $res);


    if ($note) {

        echo " NOTE: $note\n";

    }


    echo "\n";

}

?>



output di atas di mesin 32 bit:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---

Expression: 2 = 4 >> 1

 Decimal:

  val=4

  res=2

 Binary:

  val=00000000000000000000000000000100

  res=00000000000000000000000000000010

 NOTE: copy of sign bit shifted into left side


Expression: 1 = 4 >> 2

 Decimal:

  val=4

  res=1

 Binary:

  val=00000000000000000000000000000100

  res=00000000000000000000000000000001


Expression: 0 = 4 >> 3

 Decimal:

  val=4

  res=0

 Binary:

  val=00000000000000000000000000000100

  res=00000000000000000000000000000000

 NOTE: bits shift out right side


Expression: 0 = 4 >> 4

 Decimal:

  val=4

  res=0

 Binary:

  val=00000000000000000000000000000100

  res=00000000000000000000000000000000

 NOTE: same result as above; can not shift beyond 0



--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---

Expression: -2 = -4 >> 1

 Decimal:

  val=-4

  res=-2

 Binary:

  val=11111111111111111111111111111100

  res=11111111111111111111111111111110

 NOTE: copy of sign bit shifted into left side


Expression: -1 = -4 >> 2

 Decimal:

  val=-4

  res=-1

 Binary:

  val=11111111111111111111111111111100

  res=11111111111111111111111111111111

 NOTE: bits shift out right side


Expression: -1 = -4 >> 3

 Decimal:

  val=-4

  res=-1

 Binary:

  val=11111111111111111111111111111100

  res=11111111111111111111111111111111

 NOTE: same result as above; can not shift beyond -1



--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---

Expression: 8 = 4 << 1

 Decimal:

  val=4

  res=8

 Binary:

  val=00000000000000000000000000000100

  res=00000000000000000000000000001000

 NOTE: zeros fill in right side


Expression: 1073741824 = 4 << 28

 Decimal:

  val=4

  res=1073741824

 Binary:

  val=00000000000000000000000000000100

  res=01000000000000000000000000000000


Expression: -2147483648 = 4 << 29

 Decimal:

  val=4

  res=-2147483648

 Binary:

  val=00000000000000000000000000000100

  res=10000000000000000000000000000000

 NOTE: sign bits get shifted out


Expression: 0 = 4 << 30

 Decimal:

  val=4

  res=0

 Binary:

  val=00000000000000000000000000000100

  res=00000000000000000000000000000000

 NOTE: bits shift out left side



--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---

Expression: -8 = -4 << 1

 Decimal:

  val=-4

  res=-8

 Binary:

  val=11111111111111111111111111111100

  res=11111111111111111111111111111000

 NOTE: zeros fill in right side


Expression: -2147483648 = -4 << 29

 Decimal:

  val=-4

  res=-2147483648

 Binary:

  val=11111111111111111111111111111100

  res=10000000000000000000000000000000


Expression: 0 = -4 << 30

 Decimal:

  val=-4

  res=0

 Binary:

  val=11111111111111111111111111111100

  res=00000000000000000000000000000000

 NOTE: bits shift out left side, including sign bit

Output of the above example on 64 bit machines:



--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---

Expression: 2 = 4 >> 1

 Decimal:

  val=4

  res=2

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=0000000000000000000000000000000000000000000000000000000000000010

 NOTE: copy of sign bit shifted into left side


Expression: 1 = 4 >> 2

 Decimal:

  val=4

  res=1

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=0000000000000000000000000000000000000000000000000000000000000001


Expression: 0 = 4 >> 3

 Decimal:

  val=4

  res=0

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=0000000000000000000000000000000000000000000000000000000000000000

 NOTE: bits shift out right side


Expression: 0 = 4 >> 4

 Decimal:

  val=4

  res=0

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=0000000000000000000000000000000000000000000000000000000000000000

 NOTE: same result as above; can not shift beyond 0



--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---

Expression: -2 = -4 >> 1

 Decimal:

  val=-4

  res=-2

 Binary:

  val=1111111111111111111111111111111111111111111111111111111111111100

  res=1111111111111111111111111111111111111111111111111111111111111110

 NOTE: copy of sign bit shifted into left side


Expression: -1 = -4 >> 2

 Decimal:

  val=-4

  res=-1

 Binary:

  val=1111111111111111111111111111111111111111111111111111111111111100

  res=1111111111111111111111111111111111111111111111111111111111111111

 NOTE: bits shift out right side


Expression: -1 = -4 >> 3

 Decimal:

  val=-4

  res=-1

 Binary:

  val=1111111111111111111111111111111111111111111111111111111111111100

  res=1111111111111111111111111111111111111111111111111111111111111111

 NOTE: same result as above; can not shift beyond -1



--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---

Expression: 8 = 4 << 1

 Decimal:

  val=4

  res=8

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=0000000000000000000000000000000000000000000000000000000000001000

 NOTE: zeros fill in right side


Expression: 4611686018427387904 = 4 << 60

 Decimal:

  val=4

  res=4611686018427387904

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=0100000000000000000000000000000000000000000000000000000000000000


Expression: -9223372036854775808 = 4 << 61

 Decimal:

  val=4

  res=-9223372036854775808

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=1000000000000000000000000000000000000000000000000000000000000000

 NOTE: sign bits get shifted out


Expression: 0 = 4 << 62

 Decimal:

  val=4

  res=0

 Binary:

  val=0000000000000000000000000000000000000000000000000000000000000100

  res=0000000000000000000000000000000000000000000000000000000000000000

 NOTE: bits shift out left side



--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---

Expression: -8 = -4 << 1

 Decimal:

  val=-4

  res=-8

 Binary:

  val=1111111111111111111111111111111111111111111111111111111111111100

  res=1111111111111111111111111111111111111111111111111111111111111000

 NOTE: zeros fill in right side


Expression: -9223372036854775808 = -4 << 61

 Decimal:

  val=-4

  res=-9223372036854775808

 Binary:

  val=1111111111111111111111111111111111111111111111111111111111111100

  res=1000000000000000000000000000000000000000000000000000000000000000


Expression: 0 = -4 << 62

 Decimal:

  val=-4

  res=0

 Binary:

  val=1111111111111111111111111111111111111111111111111111111111111100

  res=0000000000000000000000000000000000000000000000000000000000000000


Operator perbandingan

operator perbandingan, seperti namanya, dia mengijinkan kamu untuk membandingkan 2 value. berikut contoh-contoh tipe relasi perbandingan.


$a == $b (equal/sama) TRUE jika $a adalah sama dengan $b setelah type juggling

$a === $b (Identical/identik) TRUE jika $a adalah sama dengan $b dengan tipe data yang sama

$a != $b  (tidak sama) TRUE jika $a tidak sama dengan $b setelah type juggling

$a <> $b  (tidak sama) TRUE jika $a tidak sama dengan $b setelah type juggling

$a !== $b (Not Identical/tidak identik) TRUE jika $a adalah tidak sama dengan $b atau mereka tipe data yang tidak sama

$a < $b (Less than/lebih kecil dari) TRUE jika $a lebih kecil dari $b

$a > $b (greater than/lebih besar dari) TRUE jika $a lebih besar dari $b

$a <= $b (Less than/lebih kecil dari/equal to/sama dengan) TRUE jika $a lebih kecil atau sama dengan dari $b

$a >= $b (Greater than/lebih besar dari/equal to/sama dengan) True jika $a lebih besar atau sama dengan dari $b

$a <=> $b (Spaceship) integer lebih kecil dari, sama dengan, atau lebih besar dari 0 ketika $a berturut-turut lebih kecil dari, sama dengan atau lebih besar dari $b. tersedia dari PHP 7



jika kamu bandingkan nomor dengan string atau membandingkan melibatkan/involves  string numeric, maka setiap string terconvert ke nomor dan melakukan perbandingan secara numerik. aturan ini juga terterapkan ke switch statement. berubahan tipe tidak mengambil tempat ketika membandingkan === atau !== dimana melibatkan membanding tipe sebaik seperti value.


<?php

    var_dump(0 == "a"); // 0 == 0 -> true

    var_dump("1" == "01"); // 1 == 1 -> true

    var_dump("10" == "1e1"); // 10 == 10 -> true

    var_dump(100 == "1e2"); // 100 == 100 -> true


    switch ("a") {

    case 0:

        echo "0";

        break;

    case "a": // tidak akan kesin karena "a" telah sama dengan 0

        echo "a";

        break;

    }

?>


<?php  

    // Integers

    echo 1 <=> 1; // 0

    echo 1 <=> 2; // -1

    echo 2 <=> 1; // 1

     

    // Floats

    echo 1.5 <=> 1.5; // 0

    echo 1.5 <=> 2.5; // -1

    echo 2.5 <=> 1.5; // 1

     

    // Strings

    echo "a" <=> "a"; // 0

    echo "a" <=> "b"; // -1

    echo "b" <=> "a"; // 1

     

    echo "a" <=> "aa"; // -1

    echo "zz" <=> "aa"; // 1

     

    // Arrays

    echo [] <=> []; // 0

    echo [1, 2, 3] <=> [1, 2, 3]; // 0

    echo [1, 2, 3] <=> []; // 1

    echo [1, 2, 3] <=> [1, 2, 1]; // 1

    echo [1, 2, 3] <=> [1, 2, 4]; // -1

     

    // Objects

    $a = (object) ["a" => "b"]; 

    $b = (object) ["a" => "b"]; 

    echo $a <=> $b; // 0

     

    $a = (object) ["a" => "b"]; 

    $b = (object) ["a" => "c"]; 

    echo $a <=> $b; // -1

     

    $a = (object) ["a" => "c"]; 

    $b = (object) ["a" => "b"]; 

    echo $a <=> $b; // 1

     

    // tidak hanya values yang dibandingkan; key juga harus sama

    $a = (object) ["a" => "b"]; 

    $b = (object) ["b" => "b"]; 

    echo $a <=> $b; // 1

?>



<?php

    // Bool dan null telah terbandingkan sebagai bool selalu

    var_dump(1 == TRUE);  // TRUE - sama seperti (bool)1 == TRUE

    var_dump(0 == FALSE); // TRUE - sama seperti (bool)0 == FALSE

    var_dump(100 < TRUE); // FALSE - sama seperti (bool)100 < TRUE

    var_dump(-10 < FALSE);// FALSE - sama seperti (bool)-10 < FALSE

    var_dump(min(-100, -10, NULL, 10, 100)); // NULL - (bool)NULL < (bool)-100 is FALSE < TRUE

?>


Contoh 2 Transcription dari perbandingan standard array

<?php

    // array terbandingkan seperti disini dengan perbandingan operator standard

    function standard_array_compare($op1, $op2){

        if (count($op1) < count($op2)) {

            return -1; // $op1 < $op2

        } elseif (count($op1) > count($op2)) {

            return 1; // $op1 > $op2

        }

        foreach ($op1 as $key => $val) {

            if (!array_key_exists($key, $op2)) {

                return null; // uncomparable

            } elseif ($val < $op2[$key]) {

                return -1;

            } elseif ($val > $op2[$key]) {

                return 1;

            }

        }

        return 0; // $op1 == $op2

    }


    echo standard_array_compare(['1', 2, True], [1, '2', True]); // 0

?>

Peringatan:

perbandingan floating point number

karena cara float adalah merepresentasikan secara internal, kamu seharusnya tidak test 2 float untuk menyamakan.



Ternary Operator

kondisi lain operator adalah "?:" (atau ternary operator)


Contoh pendefinisian default value


<?php

    // contoh penggunaan ternary operator

    $aksi = (empty($_POST['aksi'])) ? 'default' : $_POST['aksi'];


    //diatas adalah identik dengan if else statement dibawah ini

    if(empty($_POST['aksi'])){

        $aksi = 'default';

    }else{

        $aksi = $_POST['aksi'];

    }

?>


ekspresi (expr1) ? (expr2) : (expr3) evaluasi ke expr2 jika expr1 adalah TRUE, dan expr3 jika expr1 sama dengan FALSE.

sejak PHP 5.3, ini memungkinkan untuk tanpa part tengah dari ternary operator. ekpresi expr1 ?: expr3 return expr1 jika expr1 evaluasi  TRUE, dan expr3 sebaliknya.


CATATAN:

mohon catat bahwa ternary operator adalah ekspresi, dan itu tidak terevaluasi ke variable, tetapi hasil dari ekpresi. ini penting untuk diketahui jika kamu ingin return variable sebagai reference. statement return $var == 42 ? $a : $b; dalam return-by-regerence function akan tidak bekerja dan menghasilkan isu warning


CATATAN:

ini rekomendasi untuk kamu menghindari "stacking / tumpukan" ekspresi ternary. sifat PHP ketika menggunakan lebih dari satu ternary operator dengan single statement adalah tidak jelas:


Contoh Ternary operator yang tidak jelas

<?php

    // dalam kilas pertama, terlihat output 'true'

    echo (true?'true':false?'t':'f');


    // tetapi nyatanya outputnya adalah 't'

    // ini karena ekspresi ternary terevaluasi dari kiri ke kanan


    // berikut ini versi lebih tidak jelas

    echo ((true ? 'true' : false) ? 't' : 'f');


    // kamu bisa liat ekspresi pertama terevaluasi ke 'true', demikian cabang true dari ternary kedua

?>


Null Coalescing/penggabungan Operator

selanjutnya ada "??" (atau penggabungan null) operator, ini ada di PHP 7


Contoh Penugasan default value

    <?php

    // contoh penggunan untuk: Null Coalesce/ penggabungan operator

    $action = $_POST['action'] ?? 'default';


    // code diatas sama dengan if/else statement dibawah ini

    if (isset($_POST['action'])) {

        $action = $_POST['action'];

    } else {

        $action = 'default';

    }


?>

ekspresi (expr1) ?? (expr2) evaluasi ke expr2 jika expr1 adalah NULL, dan sebaliknya.


operator ini tidak mengijinkan pemberitahuan jika left-hand side value tidak ada, sama seperti isset(). ini berguna pada array key.


Catatan:

inagat null coalescing operator adalah ekspresi, dan itu tidak mengevaluasi ke variable, tetapi ke hasil dari ekspresi. ini penting untuk diketahui jika kamu ingin mengembalikan variable by reference. statement return $a ?? $b; dalam return-by-reference function akan tidak bekerja dan memberikan warning.


Contoh Nesting null coalescing operator

<?php


$a = null;

$b = null;

$c = 1;

$d = 2;


echo $a ?? $b ?? $c ?? $d; // outputs 1


?>


Total Komentar : 0
Tidak Ada Komentar: