位运算符

按位与运算符 & 把两个数中都为 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)

results matching ""

    No results matching ""