PHP位运算

PHP位运算

  • 二进制

二进制,是计算技术中广泛采用的一种数制,由德国数理哲学大师莱布尼茨于1679年发明。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是
“逢二进一”,借位规则是“借一当二”。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微
小的开关,用“开”来表示1,“关”来表示0。
20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。
19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0’’.’‘1’'的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。
因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。

  • 二进制的特性
  1. 只有 0 和 1 组成, 逢二进一,借一当二

  2. 二进制中有原码,反码,补码的概念

  3. 正数的原码,补码,反码都是它本身

  4. 0 的原码,反码,补码都是它本身

  5. 负数的的反码是原码的位数取反,即 0=》1, 1=》0

  6. 负数的补码是反码加+1

  7. 在二进制当中,最高位代表数的正负,0 代表正数, 1 代表负数

  8. 在PHP当中的位运算,都是以补码的形式进行的

  9. 在PHP当中,所有的数都是有符号的,即不考虑无符号数的情况

  • PHP位运算
  1. & 按位与 二进制中相对应的位都是 1 的位才为 1
var_dump(2 & 3);
2 的原码,反码,补码
00000000 00000000 00000000 00000010

3 的原码,反码,补码
00000000 00000000 00000000 00000011

按位与 2&3
00000000 00000000 00000000 00000010

// 2
  1. | 按位或 二进制当中相对应的位只要有一个是 1 的位就为 1
var_dump(2 | 3);
2 的原码,反码,补码
00000000 00000000 00000000 00000010

3 的原码,反码,补码
00000000 00000000 00000000 00000011

按位与 2|3
00000000 00000000 00000000 00000011

// 3
  1. ~ 按位取反 二进制中把相对应的位为 1 的取 0 ,为 0 的取 1
var_dump(~3);
var_dump(~2);
2 的原码,反码,补码
0 00000010
按位取反 ~2
1 11111101
最高位是1,是负数
得到反码
1 00000010
得到补码
1 00000011
// -3 1 * 1 + 1 * 2

3 的原码,反码,补码
0 00000011
按位取反 ~3
1 11111100
最高位是1,代表负
得到反码
1 00000011
得到补码
1 00000100
// -4
  1. ^ 按位异或 二进制当中相对应的位一个为 1 一个为 0 的位 才为 1
var_dump(2 ^ 3);
2 的原码,反码,补码
00000000 00000000 00000000 00000010

3 的原码,反码,补码
00000000 00000000 00000000 00000011

按位异或 2^3
00000000 00000000 00000000 00000001

// 1
  1. >> 右移 二进制中,[除以2的n次方] 最高位保持不变,(符号位不变)低位向右移动 n 位(丢掉n位),丢掉的补上符号位
$a = -2;
echo $a<<2;
// 源码 $a = 10000000 00000000 00000000 00000010

// 反码      11111111 11111111 11111111 11111101

// 补码      11111111 11111111 11111111 11111110  反码 =》 补码 反码+1

// 左移两位,符号位不变,最高位移出,低位用0补齐
//          11111111 11111111 11111111 11111000

//补码的反码,补码减一
//         111111111 11111111 11111111 11110111

//反码的源码,符号位不变,取反
//        100000000 00000000 00000000 00001000

// -8
  1. << 左移 二进制中,[乘以2的n次方] 最高位保持不变,(符号位不变)高位向左移出 n 位,低位以符号位填充 n 位
echo -2>>3;

//原码  10000000 00000000 00000000 00000010
//反码  11111111 11111111 11111111 11111101
//补码  11111111 11111111 11111111 11111110
//补码右移3位,符号位不变,最低位移出,移出位使用最高位符号位填充
//     11111111 11111111 11111111 11111111
//反码  11111111 11111111 11111111 11111110
//原码  10000000 00000000 00000000 00000001

// -1

GITHUB地址

你可能感兴趣的:(PHP)