プロが教えるわが家の防犯対策術!

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

10011とかの、二進数があった場合

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

A 回答 (5件)

当たり前すぎて、あまり答えたくはないけど、、、、



元々フラグを利用する理由は、限られた容量の中で、高速に処理させるために考案されたもの、、、あ~もっと歴史は深いか。。。

どちらにしてもフラグを文字列にしてしまっては、何の意味もない。文字列にするくらいなら、配列のほうが使い勝手がいいでしょう。

どうしても文字列がいいってんなら、{} で一文字単位で取り出せるんだから、'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
ビット位置指定はシフト。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/18 15:11

「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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/18 15:11

>> 2


自分で string に変換してれば、string として扱われるのが正常。
[quote]
string decbin ( int $number )
[/quote]

ちなみに strlen も内部で、toString を呼び出している。

# これ以上アホなこといわんでくれ。もう突っ込まんぞ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/18 15:11

んー、ゴミプロ書いてみたんですけど、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さんの方法で。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/18 15:11

>10011とかの、二進数があった場合



"10011"というフラグの並んだ「文字列」があった場合。ということですか?

>それぞれ切っていくという方法しかが浮かんだのですが

それでいいんじゃない?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/18 15:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!