1. 原码,反码,补码介绍
原码:
就是“原来的二进制码”,其实就是我们可以理解的按10进制转换为二进制之后得到的一个字符码。
原码在数学上都是可以理解的。
但在实际的计算机的运行过程中,却常常不用原码,所以就有反码,补码的问题。
在此基础上上,规则:一个二进制数字的第一个位是符号位,0表示正数,1表示负数。
例如(都以八位为例):
7: 00000111
-7: 10000111
反码:
整数的反码是它本身。
负数的反码,就是将原码的非符号部分,每一位取反。
例如:
7: 00000111
-7: 11111000
补码:
正数的补码是其本身。
负数的补码,符号位不变。其余每一位取反之后,整体加1(即反码加一)
例如:
7: 00000111
-7: 11111001
2. cpu内部运算模拟
注意:
- cpu内部运算都是通过补码运算的
- 原码,反码,补码的转换过程是系统内部的工作,且转换时符号位不变;
- 用补码运算时,符号位参与运算(即当作一个普通的二进制位的数字进行运算)
$v1 = 5;
$v2 = 3;
$r1 = $v1 + $v2;
/*
5:-->00000101(既是原码又是补码)
3:-->00000011(既是原码又是补码)
+
-------------------------
00001000
及2的三次方 (8)
*/
$v1 = 5;
$v2 = 3;
$r1 = $v1 - $v2;
//实际应用中,cpu中的相减,会被转换为相加运算
//只需要对减数取负就得到一个新的数字,然后相加
//类似这样:$r1 = $v1 + (-$v2)
/*
5:-->00000101(既是原码又是补码)
3:-->00000011(既是原码又是补码)
-3: 10000011 (原码)
-3: 11111100 (反码)
-3: 11111101 (补码)
//下面开始计算:
5: 00000101 (补码)
-3: 11111101 (补码)
+
----------------------------------
00000010 (补码)
得到的为补码,其原码也一样,结果十进制表示为2
*/
3. 管理一组事物(数据)的开关状态
开关状态:
就是某种数据,它只有2个值可用:true,false,1,0,开,关。。。。。
一组事物:
多个数据的的任意可能的出现状态
示例:
假设有5个灯泡的开关需要管理:
- 确定每个灯泡的状态:开,关
- 可以指定打开任意一个灯泡
- 可以指定关闭任意一个灯泡
设定前提:这五个灯泡有明确的顺序,我们将设定5个变量(常量其实也行)
假设1-5个灯泡的位置是从右往左边数——对应数字的位数
第1个灯泡:$d1 = 1; //00000001
第2个灯泡:$d2 = 2; //00000010
第3个灯泡:$d3 = 4; //00000100
第4个灯泡:$d4 = 8; //00001000
第5个灯泡:$d1 = 16; //00010000
则所有灯泡的总的状态,就可以使用一个变量来描述:比如:
如果$state = 7; //00000111 ,就表示第1,2,3灯泡亮
如果$state = 9; //00001001 ,就表示第1,4灯泡亮
如果$state = 13; //00001101 ,就表示第1,3,4灯泡亮
3.1 确定一个灯泡的开关状态:
s1=state & $dn; //这里n表示1-5之间的任意一个。
则结果如果$s1大于0,就表示该灯泡亮,否则就表示该灯泡是灭的。
3.2 打开指定的灯泡
state=state | $dn; //这里n表示1-5之间的任意一个
3.3 关闭指定的灯泡
state=state & ~$dn; //这里n表示1-5之间的任意一个
4. 数组运算符
注意:
php中,数组的元素的顺序,不是由下标(键名)决定的,而是完全由加入的顺序来决定。
例子 | 名称 | 结果 |
---|---|---|
a+b | 联合 | a和b的联合 |
a==b | 相等 | 如果a和b具有相同的键/值对则为true |
a===b | 全等 | 如果a和b具有相同的键/值对并且顺序和类型都相同则为true |
a!=b | 不等 | 如果a不等于b则为true |
a<>b | 不等 | 如果a不等于b则为true |
a!==b | 不全等 | 如果a不全等于b则为true |
+
运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。
$v1 = array(1, 2,3, 4);
$v2 = array(5,6,7,8,9);
$r1 = $v1 + $v2; //结果只能是:array(1,2,3,4,9)
=
运算符如果两个数组具有相同的键名和键值(可以顺序不同,或类型不同),则返回true
5. 运算符的优先级
- 括号最优先,赋值最落后(通常)
- 先乘除后加减
- 大致:算术运算符〉比较运算符〉逻辑运算符(除了“非”运算)