Featured image of post 进制和位运算

进制和位运算

进制

四种进制

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倍

1
echo 2<<3; //16

按位移动比乘法要快,计算机最后是存储2进制的,省了转换

Built with Hugo
主题 StackJimmy 设计