我正在尝试创建一个以flags作为参数的函数,但输出总是与预期的不同:
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
如何解决此问题?
答案 0 :(得分:27)
标志必须是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
对常量值使用十六进制表示法对程序的行为没有任何影响,但这是向程序员强调值组成bit field的一种惯用方法。另一种方法是使用班次:1<<0
,1<<1
,1<<2
,&amp; c。