Toán tử bitwise
Toán tử bitwise sửa đổi các bit của các giá trị liên quan. OR
Về cơ bản, một bitwise OR kết hợp với nhau từng bit của cả đối số bên trái và bên phải. Ví dụ:
5 | 2
Sẽ dịch sang bit / nhị phân là:
101 | 10
Điều này sẽ dẫn đến:
111
Bởi vì:
1 || 0 = 1
0 || 1 = 1
1 || 0 = 1
Và dưới dạng Số nguyên là đại diện của 7, chính xác là những gì bạn nhận được nếu bạn:
echo 5 | 2;
Theo lời của Eddie Izzard ... Cờ!
Như Ignacio nói, điều này thường được sử dụng nhất trong PHP (và các ngôn ngữ khác) như một cách để kết hợp nhiều cờ. Mỗi cờ thường được định nghĩa là một hằng số có giá trị thường được đặt thành một số nguyên chỉ đại diện cho một bit ở một độ lệch khác:
define('FLAG_A', 1);
define('FLAG_B', 2);
define('FLAG_C', 4);
define('FLAG_D', 8);
Sau đó, khi bạn OR
kết hợp chúng với nhau, chúng hoạt động trên mỗi bit bù đắp của riêng chúng và sẽ không bao giờ va chạm:
FLAG_A | FLAG_C
Dịch sang:
1 | 100
Vì vậy, bạn sẽ bật:
101
Biểu thị số nguyên 5.
Sau đó, tất cả những gì mã phải làm — mã sẽ phản ứng với các cờ khác nhau đang được đặt — như sau (sử dụng một chút AND
):
$combined_flags = FLAG_A | FLAG_C;
if ( $combined_flags & FLAG_A ) {
}
if ( $combined_flags & FLAG_B ) {
}
if ( $combined_flags & FLAG_C ) {
}
Vào cuối ngày, nó chỉ làm cho mọi thứ dễ đọc hơn bằng cách đặt các hằng số được đặt tên và nói chung là tối ưu hơn bằng cách dựa vào các giá trị số nguyên thay vì chuỗi hoặc mảng. Một lợi ích khác của việc sử dụng hằng số là nếu chúng bị gõ nhầm khi được sử dụng, trình biên dịch sẽ ở trong tình huống tốt hơn để thông báo và đưa ra cảnh báo ... nếu một giá trị chuỗi được sử dụng, nó không có cách nào để biết rằng có gì sai.
define('MY_FLAG_WITH_EASY_TYPO', 1);
my_function_that_expects_a_flag( MY_FLAG_WITH_EASY_TPYO );
my_function_that_expects_a_flag( 'my_string_with_easy_tpyo' );