Hướng dẫn dùng operator bitwise trong PHP

Hai phép toán cơ bản đối với hệ nhị phân là OR và AND.

HOẶC có nghĩa là 'nếu A bật hoặc B bật'. Một ví dụ trong thế giới thực sẽ là hai thiết bị chuyển mạch song song. Nếu một trong hai cho phép dòng điện chạy qua, thì dòng điện đi qua.

AND có nghĩa là 'nếu cả A và B đều bật'. Ví dụ trong thế giới thực là hai công tắc mắc nối tiếp. Dòng điện sẽ chỉ đi qua nếu cả hai đều cho phép dòng điện chạy qua.

Trong máy tính, đây không phải là công tắc vật lý mà là chất bán dẫn và chức năng của chúng được gọi là cổng logic . Chúng làm những việc tương tự như công tắc - phản ứng với dòng điện hoặc không có dòng điện.

Khi áp dụng cho số nguyên, mọi bit trong một số được kết hợp với mọi bit trong số kia. Vì vậy, để hiểu các toán tử theo chiều bit OR và AND, bạn cần chuyển các số thành nhị phân, sau đó thực hiện phép toán OR hoặc AND trên mọi cặp bit phù hợp.

Đó là lý do tại sao:

00011011 [odd number]
AND
00000001 [& 1]
== 
00000001 [results in 1]

Trong khi

00011010 [even number]
AND
00000001 [& 1]
==
00000000 [results in 0]

Do đó, phép toán [& 1] so sánh bit ngoài cùng bên phải với 1 bằng cách sử dụng logic AND. Tất cả các bit khác được bỏ qua một cách hiệu quả bởi vì bất cứ điều gì VÀ không có gì là không có gì. Một số chẵn trong hệ nhị phân cũng là một số chẵn trong ký hiệu thập phân [10 là bội số của 2].

Các hoạt động cơ bản khác đối với hệ thống nhị phân bao gồm NOT và XOR. NOT có nghĩa là 'nếu A tắt' và là dạng cổng logic duy nhất chỉ nhận một tín hiệu hoặc 'tham số' thay vì hai. XOR có nghĩa là 'nếu A hoặc B được bật, nhưng không phải cả hai'. Và sau đó là NAND, NOR và NXOR, về cơ bản KHÔNG được kết hợp với AND, OR và XOR, tức là NAND có nghĩa là 'nếu cả A và B đều không nằm trên'.

Trong lập trình, toán tử

& means AND,
| means OR, 
~ means NOT, and
^ means XOR.

Những cái khác có thể được tạo thành bằng cách kết hợp chúng, ví dụ:

~ [a & b] is equivalent to a NAND operation

Ghi chú cụ thể về PHP

Toán tử bitwise không hoạt động trên các giá trị dấu phẩy động và trong PHP, các giá trị float sẽ được chuyển đổi ngầm thành số nguyên trước tiên. Các số bên ngoài phạm vi có thể được biểu thị dưới dạng số nguyên sẽ bị cắt ngắn thành 0 - nghĩa là tất cả các số trên PHP_INT_MAX sẽ trông "chẵn" trong biểu thức [$num & 1]]. Nếu bạn muốn hỗ trợ các số bên ngoài PHP_INT_MIN / PHP_INT_MAX, bạn sẽ cần fmod[$num, 2]. Tuy nhiên, nếu bạn đang sử dụng PHP 64-bit, các số nguyên của bạn sẽ có độ chính xác cao hơn float.

27 hữu ích 1 bình luận chia sẻ

Bitwise operators allow evaluation and manipulation of specific bits within an integer.

Bitwise Operators ExampleNameResult
$a & $b And Bits that are set in both $a and $b are set.
$a | $b Or [inclusive or] Bits that are set in either $a or $b are set.
$a ^ $b Xor [exclusive or] Bits that are set in $a or $b but not both are set.
~ $a Not Bits that are set in $a are not set, and vice versa.
$a > $b Shift right Shift the bits of $a $b steps to the right [each step means "divide by two"]

Bit shifting in PHP is arithmetic. Bits shifted off either end are discarded. Left shifts have zeros shifted in on the right while the sign bit is shifted out on the left, meaning the sign of an operand is not preserved. Right shifts have copies of the sign bit shifted in on the left, meaning the sign of an operand is preserved.

Use parentheses to ensure the desired precedence. For example, $a & $b == true evaluates the equivalency then the bitwise and; while [$a & $b] == true evaluates the bitwise and then the equivalency.

If both operands for the &, | and ^ operators are strings, then the operation will be performed on the ASCII values of the characters that make up the strings and the result will be a string. In all other cases, both operands will be converted to integers and the result will be an integer.

If the operand for the ~ operator is a string, the operation will be performed on the ASCII values of the characters that make up the string and the result will be a string, otherwise the operand and the result will be treated as integers.

Both operands and the result for the operators are always treated as integers.

PHP's error_reporting ini setting uses bitwise values,
providing a real-world demonstration of turning
bits off. To show all errors, except for notices,
the php.ini file instructions say to use:
E_ALL & ~E_NOTICE
      
This works by starting with E_ALL:
00000000000000000111011111111111
Then taking the value of E_NOTICE...
00000000000000000000000000001000
... and inverting it via ~:
11111111111111111111111111110111
Finally, it uses AND [&] to find the bits turned
on in both values:
00000000000000000111011111110111
      
Another way to accomplish that is using XOR [^]
to find bits that are on in only one value or the other:
E_ALL ^ E_NOTICE
      
error_reporting can also be used to demonstrate turning bits on.
The way to show just errors and recoverable errors is:
E_ERROR | E_RECOVERABLE_ERROR
      
This process combines E_ERROR
00000000000000000000000000000001
and
00000000000000000001000000000000
using the OR [|] operator
to get the bits turned on in either value:
00000000000000000001000000000001
      

Example #1 Bitwise AND, OR and XOR operations on integers

The above example will output:

 ---------     ---------  -- ---------
 result        value      op test
 ---------     ---------  -- ---------
 Bitwise AND
[ 0 = 0000] = [ 0 = 0000] & [ 5 = 0101]
[ 1 = 0001] = [ 1 = 0001] & [ 5 = 0101]
[ 0 = 0000] = [ 2 = 0010] & [ 5 = 0101]
[ 4 = 0100] = [ 4 = 0100] & [ 5 = 0101]
[ 0 = 0000] = [ 8 = 1000] & [ 5 = 0101]

 Bitwise Inclusive OR
[ 5 = 0101] = [ 0 = 0000] | [ 5 = 0101]
[ 5 = 0101] = [ 1 = 0001] | [ 5 = 0101]
[ 7 = 0111] = [ 2 = 0010] | [ 5 = 0101]
[ 5 = 0101] = [ 4 = 0100] | [ 5 = 0101]
[13 = 1101] = [ 8 = 1000] | [ 5 = 0101]

 Bitwise Exclusive OR [XOR]
[ 5 = 0101] = [ 0 = 0000] ^ [ 5 = 0101]
[ 4 = 0100] = [ 1 = 0001] ^ [ 5 = 0101]
[ 7 = 0111] = [ 2 = 0010] ^ [ 5 = 0101]
[ 1 = 0001] = [ 4 = 0100] ^ [ 5 = 0101]
[13 = 1101] = [ 8 = 1000] ^ [ 5 = 0101]

Example #2 Bitwise XOR operations on strings

Example #3 Bit shifting on integers

Output of the above example on 32 bit machines:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 >> 1
 Decimal:
  val=4
  res=2
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 >> 2
 Decimal:
  val=4
  res=1
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000001

Expression: 0 = 4 >> 3
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: bits shift out right side

Expression: 0 = 4 >> 4
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0


--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
  val=-4
  res=-2
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2
 Decimal:
  val=-4
  res=-1
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 >> 3
 Decimal:
  val=-4
  res=-1
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1


--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 > 4
 Decimal:
  val=4
  res=0
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0


--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
  val=-4
  res=-2
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2
 Decimal:
  val=-4
  res=-1
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 >> 3
 Decimal:
  val=-4
  res=-1
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1


--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 

Chủ Đề