質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • PHP

    20369questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ビットの論理積について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 368

gsuisk

score 64

PHPのビット演算子である&がよく理解できません。マニュアルによると$a & $bは 

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

こうあります。マニュアルにあるコードを例にあげると

function odd($var)
{
    // 渡された整数が奇数かどうかを返します
    return($var & 1);
}

この関数は、$varが奇数の時にTRUEを返すのですか?

また、($var & 1)の部分ですが

$varが奇数であれば、2進数の最下位ビット(LSB)が1になるのは理解できます。

例えば、$varが5だったら2進数では101になり、1は2進数でも1のままです。

そうだとすると、「101 & 1」という意味ですか?
この&は最下位ビットが同じかどうかを比較しているのでしょうか?

教えていただけるとうれしいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

この&は最下位ビットが同じかどうかを比較しているのでしょうか? 

違います。6 & 3を考えてみると、
6: 00000110
3: 00000011
-------
&: 00000010 (両方が1の時だけ1になる)

結果は非ゼロ(2)なので、真か偽かというと真になります。

あくまで、対応するビット同士のandを取って、数値を返す演算です。

その数値の結果を「真か偽か」つまり「非ゼロかゼロか」と判断するのはその先の話です。
「非ゼロかゼロか」という判断では無く「2に等しいか?」等という判断をする事もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/13 16:22

    例えば5と1を比較すると

    5: 00000101
    1: 00000001

    同じ桁同士を比較して、両方が1の桁は1になり、両方が0の桁は0になる。
    それぞれが異なる場合は0になる。

    よって1と比較することで、1の位が1か0かだけで偶数奇数がわかる。

    こういうことですよね?

    キャンセル

  • 2017/09/13 16:23

    function odd($var)
    {
    // 渡された整数が奇数かどうかを返します
    return($var & 1);
    }

    これは結局、TRUE/FALSEではなく、1か0の値を返す関数ということで良いでしょうか?

    キャンセル

  • 2017/09/13 21:16

    どちらも合っています。
    「比較すると」⇒「ビット論理積を取ると」ですが。

    キャンセル

  • 2017/09/14 00:51

    もしかして、
    & を ==(等しい) や >=(以上) の仲間だと思っていますか?
    そうじゃなくて、+(加算) や *(乗算) の仲間です。

    キャンセル

  • 2017/09/15 01:02

    わかりました!ありがとうございます。

    キャンセル

+2

ビットごとの AND をとった場合、対象のうちでチェックしたいビット以外を 0 に落とすことができます(上の例でいえば、1 と AND をとることで「LSB 以外をすべて0にする」わけです)
この状態で AND の結果は、0 or 1 の2値になります。
ですので、AND の結果が 1 ならば奇数、0 ならば偶数であると判断ができます。
※本来はPHP (($var & 1) == 1)で true/false を返したほうが良いのですが

これはシステムコールやハードウェアとのやり取りで、ビットそれぞれが意味を持っている場合などによく使われる手法です。
※他に身近な例としては UNIX における umask とパーミッションですとか、IP アドレスのサブネットマスクなどもありますね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/13 16:13

    ありがとうございました!

    キャンセル

+1

この&の動作は、ビットごとのANDと呼ばれることがあります。言葉の通り、2つの値の同じ位置のビットを比較して、それぞれにANDを取っていきます。

5:00000101
1:00000001
----------
1:00000001 (上と下の同じビット位置でANDを取った結果)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20369questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。