php位运算

位运算在开发中基本用不到,属于计算机底层的操作。计算机在进行加减运算时,其实都是在做加运算,由于计算机内部是用的二进制,因此CPU在处理十进制运算时会先计算出二进制(既原码),在根据原码计算出反码,最后通过反码得到补码。在计算机中,数值一律用补码表示和存储的,因为通过原码无法做减法运算,但是通过补码可以。

二进制:由0和1构成的一个32位数字,逢二进一。例如,十进制3的二进制表示是 00000000 00000000 00000000 00000011。一个数字就是一个Bit(比特),它是计算机存储的最小单位,8Bit等于一个Byte(字节), 所以一个十进制数就是4个字节。

1KB = 1024Byte = 2 ^ 10Byte; 1Byte = 8Bit; 

正数的反码和补码同原码都是一样的,负数却不同。负数的反码等于:原码的符号位不变(第一位表示符号位,0表示正,1表示负),其他为位按位取反。负数的补码等于:反码加1。

关于为什么计算机要用补码进行运算,这里有一篇不错的文字。计算机为什么采用补码存储数据

// 数字5的原码、反码和补码
原码:00000000 00000000 00000000 00000101
反码:00000000 00000000 00000000 00000101
补码:00000000 00000000 00000000 00000101

// 数字-3的原码、反码和补码
原码:10000000 00000000 00000000 00000011
反码:11111111 11111111 11111111 11111100
补码:11111111 11111111 11111111 11111101

下面是php中位运算的所有表示法

$a & $b     And(按位与)       将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b     Or(按位或)        将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $b     Xor(按位异或)      将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $a        Not(按位取反)      将 $a 中为 0 的位设为 1,反之亦然。
$a << $b    Shift left(左移)  将 $a 中的位向左移动 $b 次(每一次移动都表示"乘以 2")。
$a >> $b    Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示"除以 2")。

这里就以$a & $b为例说明一下

$a = 5;
$b = -3;
echo $a & $b; // 5

// 运算后的补码:00000000 00000000  00000000 0000101 
// 反码:00000000 00000000  00000000 0000101 
// 原码:00000000 00000000  00000000 0000101 => 5

posted @ 2019-06-10 10:12:03 浏览(169) PHP

avatar