19

引数としてフラグを使用して関数を作成しようとしていますが、出力は常に期待されるものとは異なります。

define("FLAG_A", 1);  
define("FLAG_B", 4);  
define("FLAG_C", 7);  
function test_flags($flags) {  
 if($flags & FLAG_A) echo "A";  
 if($flags & FLAG_B) echo "B";  
 if($flags & FLAG_C) echo "C";   
}  
test_flags(FLAG_B | FLAG_C); # Output is always ABC, not BC  

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

32

フラグをビット単位で、または適切に組み合わせるには、2の累乗である必要があります。

define("FLAG_A", 0x1);
define("FLAG_B", 0x2);
define("FLAG_C", 0x4);
function test_flags($flags) {
  if ($flags & FLAG_A) echo "A";
  if ($flags & FLAG_B) echo "B";
  if ($flags & FLAG_C) echo "C";
}
test_flags(FLAG_B | FLAG_C); # Now the output will be BC

定数値に16進表記を使用しても、プログラムの動作に違いはありませんが、値がビットフィールドを構成することをプログラマーに強調する慣用的な方法の1つです。もう1つは、シフトを使用することです:、、、1<<0&c。1<<11<<2

于 2010-08-28T05:18:30.747 に答える