• ベストアンサー

【php】二進数をフラグとして扱いたい

【php】二進数をフラグとして扱いたい 10011とかの、二進数があった場合 true flase flase true ture みたいな感じで処理できるようにしたいのですが 10011という文字列を それぞれ切っていくという方法しかが浮かんだのですが なにか、もっといいスマートな方法があれば、アドバイスをお願いいたします。

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

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

当たり前すぎて、あまり答えたくはないけど、、、、 元々フラグを利用する理由は、限られた容量の中で、高速に処理させるために考案されたもの、、、あ~もっと歴史は深いか。。。 どちらにしてもフラグを文字列にしてしまっては、何の意味もない。文字列にするくらいなら、配列のほうが使い勝手がいいでしょう。 どうしても文字列がいいってんなら、{} で一文字単位で取り出せるんだから、'10011'{1} == 1 とかでよろい。 # データって元々数値のはずだけど、PHP などの出現で文字列だって考える人が増えとるのかな。文字列なんてデータ表現の一つに過ぎないのに。。。文字化けとかで悩むのもやっぱその辺から来てるのかな。。。 ↑はいいとして、フラグはその値を整数値に格納して、ビット演算することで、その効果を発揮しる。 $flag = 0x13; if ($flag & 0x01) echo '0番目のフラグは on です'; if ($flag & 0x02) echo '1番目のフラグは on です'; if ($flag & 0x03) echo '0,1番目のフラグは on です'; 又は、 if ($flag & 0x02 | 0x01) echo '0,1番目のフラグは on です'; // (1) # (1) http://jp2.php.net/manual/ja/domdocument.load.php など、$option を OR でつなげとはこういうこと。 特定フラグの on/off は XOR ビット位置指定はシフト。

yuzuru0024
質問者

お礼

回答ありがとうございます。

その他の回答 (4)

  • think49
  • ベストアンサー率59% (285/482)
回答No.5

「Cookieを圧縮したい」という質問に「64進数→2進数の変換を行えば、圧縮できる」とbabu_babooさんが回答されているのを思い出しました、 保存データの圧縮方法 | OKWave http://okwave.jp/qa/q5790194.html > 10011という文字列を それぞれ切っていくという方法しかが浮かんだのですが 配列にしてみては、どうでしょう? <?php $flag_num = 10; // 2進数で格納したフラグ $flag_arr = str_split(decbin($flag_num)); // 2進数に変換→配列にする header('Content-Type: text/plain; charset=UTF-8'); var_dump($flag_arr); ?> str_split http://www.phpmanual.jp/function.str-split.html

yuzuru0024
質問者

お礼

回答ありがとうございます。

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

>> 2 自分で string に変換してれば、string として扱われるのが正常。 [quote] string decbin ( int $number ) [/quote] ちなみに strlen も内部で、toString を呼び出している。 # これ以上アホなこといわんでくれ。もう突っ込まんぞ。

yuzuru0024
質問者

お礼

回答ありがとうございます。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

んー、ゴミプロ書いてみたんですけど、PHPの中で二進数はStringとして扱われるっぽいですね。 なので、俺も ぶつ切りしか思いつきませんでした。 <? $dec = 30; $bin = decbin($dec); print "$dec " . gettype($dec) . "<br>"; print "$bin " . gettype($bin) . "<br>"; for($i=0;$i<(strlen($bin));$i++) { $bit = $bin[$i] ? "true" : "false"; print $bit . "<br>"; } ?> アセンブラライクな方法をお望みでしたら、#2さんの方法で。

yuzuru0024
質問者

お礼

回答ありがとうございます。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>10011とかの、二進数があった場合 "10011"というフラグの並んだ「文字列」があった場合。ということですか? >それぞれ切っていくという方法しかが浮かんだのですが それでいいんじゃない?

yuzuru0024
質問者

お礼

回答ありがとうございます。

関連するQ&A