LoginSignup
0
0

More than 1 year has passed since last update.

Bit演算子について

Last updated at Posted at 2022-08-07

うす、豚野郎です。
最近、このQiitaの存在を会社の人にバラしたら
「おっす!豚野郎です!」といじられました。

さて、今回はBit演算子について書いていこうと思います。
プログラムでも2進数が使えることを初めて知りました。

公式ドキュメントに沿って書いていこうと思います。
https://www.php.net/manual/ja/language.operators.bitwise.php

・バージョン:PHP 7.4.29

順番的に以下の順番で書いていきます。
1.ビット積
2.ビット和
3.排他的論理和
4.否定
5.左シフト
6.右シフト

1. ビット積

$a および $b の両方にセットされているビットがセットされます

ここでは3と5を例に書いていきます。
10は二進数だと1010、15は二進数だと1111です。

この場合、ビット積は1010になるので、結果は10になるはずなので検証します。

bit.php
<?php

    $a = 10;
    $b = 15;

    echo $a & $b;

?>

結果

10

2. ビット和

$a または $b のどちらかにセットされているビットがセットされます

ここでは8と5を例に書いていきます。
8は二進数だと1000、5は二進数だと101です。

この場合、ビット和は1101になるので、結果は13になるはずなので検証します。

bit.php
<?php

    $a = 8;
    $b = 5;

    echo $a | $b;

?>

結果

13

3. 排他的論理和

$a または $b のどちらか一方にセットされており、両方にセットされていないビットがセットされます

ここでは3と5を例に書いていきます。
6は二進数だと110、3は二進数だと11です。

この場合、排他的論理和は101になるので、数字だと5になるはずなので検証します。

bit.php
<?php

    $a = 6;
    $b = 3;

    echo $a ^ $b;

?>

結果

5

4. 否定

$a にセットされているビットはセットせず、そうでないものは逆にします

ここでは8を例に書いていきます。
8は二進数だと1000です。

この場合、否定は0111になるので、数字だと7になるはずなので検証します。

bit.php
<?php

    $a = 8;

    echo ~$a;

?>

結果

-9

なぜだ。
$aを9にすると、結果は-10になる。
2進数に変換してみます。
・参考:https://www.sejuku.net/blog/78679

bit.php
<?php

    $a = 8;

    echo decbin(~$a);

?>

結果

1111111111111111111111111111111111111111111111111111111111110111

64桁になりました。
最初の4桁が否定になり、残りは0が反転され1になってます。

結果を7にしたい場合、以下の様にする必要があります。

bit.php
<?php

    $a = 8;

    echo ~8 & 0b1111;

?>

結果

7

5. 左シフト

$a のビットを左に $b ビットシフトする (各シフトは "2をかける" ことを意味します)

ここでは5を例に書いていきます。
左シフトすると2倍になります。
この場合、左シフトは1010になるので、数字だと10になるはずなので検証します。

bit.php
<?php

    $a = 5;
    $b = 1;

    echo $a << $b;

?>

結果

10

6. 右シフト

$a のビットを右に $b ビットシフトします (各シフトは "2で割る" ことを意味します)

右へシフトすると1/2になります。

ここでは8を例に書いていきます。
この場合、右シフトは0100になるので、数字だと4になるはずなので検証します。

bit.php
<?php

    $a = 8;
    $b = 1;

    echo $a >> $b;

?>

結果

4

では、奇数だとどうなるでしょうか?
7は二進数で111になるので、どうなるか検証します。
予想は11になるため、3になります。(1/2ではありませんが)

bit.php
<?php

    $a = 7;
    $b = 1;

    echo $a >> $b;

?>

結果

3

想定通りでした。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0