2010-08-28 7 views
15

Tôi đang cố gắng để tạo ra một chức năng với cờ như các đối số của nó nhưng đầu ra là luôn luôn khác nhau với những gì đang mong đợi:Cờ chức năng PHP, làm cách nào?

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 

Làm thế nào tôi có thể khắc phục vấn đề này?

Trả lời

25

Cờ phải là quyền hạn của 2 để bitwise hoặc cùng nhau đúng cách.

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 

Sử dụng ký hiệu thập lục phân cho các giá trị liên tục làm cho không có sự khác biệt với các hành vi của các chương trình, nhưng là một cách thành ngữ nhấn mạnh đến lập trình viên rằng các giá trị soạn bit field. Một cách khác là sử dụng ca làm việc: 1<<0, 1<<1, 1<<2, & c.

+0

Aah, cảm ơn rất nhiều sự giúp đỡ của bạn! – Teiv

+2

Dude, kỳ vọng đầu ra từ Nhận xét của bạn không đúng. Bởi vì đầu ra sẽ luôn luôn khác - BC thay vì ABC và đây là một hành vi đúng đắn cho chương trình. –