• ベストアンサー

PHPで2進数の結果出力

お世話になります。 下記のように2進数を処理したいのです。 ご存じの方お手数ですが回答の方よろしくお願いします。 $a=0011001(2進) a(1桁目) $b1="りんご" a(2桁目) $b2="みかん" a(3桁目) $b3="メロン" a(4桁目) $b4="パイナップル a(5桁目) $b5="いちご" a(6桁目) $b6="すいか" a(7桁目) $b7="レモン" echo $b1."と".$b2."と".$b3."と".$b4."と".$b5."と".$b6."と".$b7; 出力結果:メロンとパイナップルとレモン

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

2進数値を「数値」として見たらビット数という情報は無くなってしまいますから、ビットは下位から数えた方がいいかと思います。 (2進数「0011001」も2進数「11001」も、10進数で表すなら25になるまったく同じ数値です) 以下のコードでは、「$a & (1 << $i)」の部分がビット判断のキモです。 「1 << $i」は$i=0の時は「1」に、$i=6の時は「64(2進数で1000000)」になります。 「&」はビット積演算子ですので、「$a&(1<<$i)」は、(1<<$i)に該当する$aビットが0になっているときには0に、ビットが1になっているときは非ゼロになりますので、ビット判定として使えます。 <?php // $fruits=array("レモン", "すいか", "いちご", "パイナップル", "メロン", "みかん", "りんご"); $fruits[6]="りんご"; $fruits[5]="みかん"; $fruits[4]="メロン"; $fruits[3]="パイナップル"; $fruits[2]="いちご"; $fruits[1]="すいか"; $fruits[0]="レモン"; $a=bindec("0011001"); $b=array(); for ($i = count($fruits)-1; $i >= 0; $i--) { if ($a & (1 << $i)) { $b[] = $fruits[$i]; } } print join("と", $b); ?>

seventozero
質問者

お礼

2進を数える方向反対でしたね、すいません。 よくわかりました、ありがとうございます。

その他の回答 (1)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.1

ネタ mysql_query("SELECT MAKE_SET(b'0011001', 'りんご', 'みかん', ...);");

seventozero
質問者

お礼

回答頂き、ありがとうございました。

関連するQ&A