进制
四种进制
10 进制 decimal 简写:dec
16 进制 hexadecimal 简写:hex
8 进制 octonary 简写:oct
2 进制 binary 简写:bin
10 进制
十进制数由不以0开头的数字序列表示
1
2
3
4
| ... 万位 千位 百位 十位 个位 (满10进1)
9 9 9 9 9
echo 123; //从右到左 3个位,分别时以 1顶1,以1顶10,以1顶100
echo 1*3 + 10*2 + 100*1;
|
16 进制(满16进1)
十六进制数是以0x
开头,接着是数字(0 ~ 9)或字母(A ~ F)的序列。字母可以是大写或小写,通常是大写
1
2
| echo 0x123; //从右到左 3 个位,分别是以 1顶1,以 1顶16, 以 1顶256(16的n次方)
echo 0x1c; //12*1 + 1*16 = 28
|
8 进制(满8进1)
八进制数是有一个前导0和一个从0~7的数字序列组成
1
2
3
| echo 0123; //从右到左 3 个位,分别是以 1顶1,以 1顶8,以 1顶64(8的n次方)
echo 027; //1*7 + 2*8 = 23
echo 028; //2 当出现不合法值,后面的值会忽略
|
2 进制(满2进1)
二进制数以0b
开始,接着由一个数字(0 和 1)序列组成
1
2
3
| //从右到左,分别以 1顶1,以 1顶2, 顶4, 顶8, 顶16 ..... (2的n次方)
echo 0b0011; //1*1 + 1*2 = 3
echo 0b01100; // 0*1 + 0*2 + 1*4 + 1*8 = 12
|
进制转换
10 进制转换其他进制,除以该进制,直到除尽或除不尽即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| 133 转 2 进制
______
2 | 133 余1
______
2 | 66 余0
______
2 | 33 余1
______
2 | 16 余0
______
2 | 8 余0
______
2 | 4 余0
______
2 | 2 余0
______
| 1
0b10000101 // 1*1 + 0*2 + 1*4 + 0*8 + 0*16 + 0*32 + 0*64 + 1*128 = 133
133 转 8 0205
133 转 16 0x85
|
位运算
一个字节有8个位,我们将这8个位来进行运算,就叫位运算
位运算 是针对字节上的位来进行运算
位运算符: & | ^ ~ » «
位上有 1/0,如果将 1/0 当真假来看,1是真 0是假
& 逻辑与
1
2
3
4
5
| 5 0000 0101
12 0000 1100
&-------------
0000 0100
echo 5 & 12; //4
|
| 逻辑或
1
2
3
4
5
| 5 0000 0101
12 0000 1100
|-------------
0000 1101
echo 5 | 12; //13
|
^ 逻辑异或
逻辑异或,两者不一样则为真 一样为假
1
2
3
4
5
| 5 0000 0101
12 0000 1100
^-------------
0000 1001
echo 5 ^ 12; //9
|
~ 逻辑反
逻辑反,只能求一个字符,就是 1->0 , 0->1
1
2
3
4
| 5 0000 0101
~-------------
1111 1010
echo ~5; //-6
|
PHP 的 int 型则是有符号的
取决于8个位的 最左面的位(最高位) 是否为1
如果为 1 则是 负数 -1~-128
如果为 0 则是 整数 0~127
<< >> 位运算
<< 按位左移 空位补0
>> 按位右移 空位补0
1
2
3
4
5
6
7
8
9
| 5 0000 0101
<<------------
0000 1010
echo 5<<1; //10
5 0000 0101
>>------------
0000 0010
echo 5>>1; //2
|
2 进制,左移一位增大2倍
将一个数快速的增大8倍
按位移动比乘法要快,计算机最后是存储2进制的,省了转换