位运算符
按位与运算符 &
把两个数中都为 1 的位设为 1 。
<?php
var_dump(0 & 5); // (00000000 00000000 00000000 00000000) & (00000000 00000000 00000000 00000101) => (00000000 00000000 00000000 00000000) => int(0)
var_dump(2 & 5); // (00000000 00000000 00000000 00000010) & (00000000 00000000 00000000 00000101) => (00000000 00000000 00000000 00000000) => int(0)
var_dump(-4 & 5); // (11111111 11111111 11111111 11111100) & (00000000 00000000 00000000 00000101) => (00000000 00000000 00000000 00000100) => int(4)
var_dump(-8 & -5); // (11111111 11111111 11111111 11111000) & (11111111 11111111 11111111 11111011) => (11111111 11111111 11111111 11111000) => int(-8)
$foo = -8; // (11111111 11111111 11111111 11111000)
$bar = -5; // (11111111 11111111 11111111 11111011)
$foo &= $bar; // (11111111 11111111 11111111 11111000)
var_dump($foo); // int(-8)
按位或运算符 |
把两个数中任何一个为 1 的位设为 1 。
<?php
var_dump(0 | 5); // (00000000 00000000 00000000 00000000) | (00000000 00000000 00000000 00000101) => (00000000 00000000 00000000 00000101) => int(5)
var_dump(2 | 5); // (00000000 00000000 00000000 00000010) | (00000000 00000000 00000000 00000101) => (00000000 00000000 00000000 00000111) => int(7)
var_dump(-4 | 5); // (11111111 11111111 11111111 11111100) | (00000000 00000000 00000000 00000101) => (11111111 11111111 11111111 11111101) => int(-3)
var_dump(-8 | -5); // (11111111 11111111 11111111 11111000) | (11111111 11111111 11111111 11111011) => (11111111 11111111 11111111 11111011) => int(-5)
$foo = -8; // (11111111 11111111 11111111 11111000)
$bar = -5; // (11111111 11111111 11111111 11111011)
$foo |= $bar; // (11111111 11111111 11111111 11111011)
var_dump($foo); // int(-5)
按位异或运算符 ^
把两个数中一个为 1 另一个为 0 的位设为 1 。
<?php
var_dump(0 ^ 5); // (00000000 00000000 00000000 00000000) ^ (00000000 00000000 00000000 00000101) => (00000000 00000000 00000000 00000101) => int(5)
var_dump(2 ^ 5); // (00000000 00000000 00000000 00000010) ^ (00000000 00000000 00000000 00000101) => (00000000 00000000 00000000 00000111) => int(7)
var_dump(-4 ^ 5); // (11111111 11111111 11111111 11111100) ^ (00000000 00000000 00000000 00000101) => (11111111 11111111 11111111 11111001) => int(-7)
var_dump(-8 ^ -5); // (11111111 11111111 11111111 11111000) ^ (11111111 11111111 11111111 11111011) => (00000000 00000000 00000000 00000011) => int(3)
$foo = -8; // (11111111 11111111 11111111 11111000)
$bar = -5; // (11111111 11111111 11111111 11111011)
$foo ^= $bar; // (00000000 00000000 00000000 00000011)
var_dump($foo); // int(3)
按位取反运算符 ~
把一个数中为 0 的位设为 1 ,为 1 的位设为 0 。
<?php
var_dump(~0); // (00000000 00000000 00000000 00000000) => (11111111 11111111 11111111 11111111) => int(-1)
var_dump(~2); // (00000000 00000000 00000000 00000010) => (11111111 11111111 11111111 11111101) => int(-3)
var_dump(~-4); // (11111111 11111111 11111111 11111100) => (00000000 00000000 00000000 00000011) => int(3)
var_dump(~-8); // (11111111 11111111 11111111 11111000) => (00000000 00000000 00000000 00000111) => int(7)
按位左移运算符 <<
把一个数的位向左移动指定的位数。左移时右侧以零填充,符号位被移走意味着正负号不被保留。
<?php
var_dump(0 << 2); // (00000000 00000000 00000000 00000000) => (00000000 00000000 00000000 00000000) => int(0)
var_dump(2 << 2); // (00000000 00000000 00000000 00000010) => (00000000 00000000 00000000 00001000) => int(8)
var_dump(-4 << 2); // (11111111 11111111 11111111 11111100) => (11111111 11111111 11111111 11110000) => int(-16)
var_dump(-8 << 2); // (11111111 11111111 11111111 11111000) => (11111111 11111111 11111111 11100000) => int(-32)
$foo = -8; // (11111111 11111111 11111111 11111000)
$foo <<= 2; // (11111111 11111111 11111111 11100000)
var_dump($foo); // int(-32)
按位右移运算符 >>
把一个数的位向右移动指定的位数。右移时左侧以符号位填充,意味着正负号被保留。
<?php
var_dump(0 >> 2); // (00000000 00000000 00000000 00000000) => (00000000 00000000 00000000 00000000) => int(0)
var_dump(2 >> 2); // (00000000 00000000 00000000 00000010) => (00000000 00000000 00000000 00000000) => int(0)
var_dump(-4 >> 2); // (11111111 11111111 11111111 11111100) => (11111111 11111111 11111111 11111111) => int(-1)
var_dump(-8 >> 2); // (11111111 11111111 11111111 11111000) => (11111111 11111111 11111111 11111110) => int(-2)
$foo = -8; // (11111111 11111111 11111111 11111000)
$foo >>= 2; // (11111111 11111111 11111111 11111110)
var_dump($foo); // int(-2)