进制

进制

进制的基本概念

(1)基本概念
进位机制, 通俗的讲, 逢几往前进一位。
(2)生活中的进制举例:
1024byte = 1kb;
1024kb = 1Mb;
1024Mb = 1Gb;
1024Gb = 1Tb;
像存储就是1024进制, 逢1024往前进一位
还有例如时间, 60进制, 60秒1分钟, 60分钟1小时
(3)基数的概念
基数指的是某进制每一位可以表示数的个数
比如十进制,每一位上的数就是,从0到9, 共10个数, 所以十进制的基数就是10.
(4)进制存在的意义.
用有限的数字来表示无限的数.

计算机中常见的进制

二进制:每一位只有0和1两个数
八进制:每一位只有0-7 八个数
十六进制: 每一位是从0-F 十六个数

进制的快速对照表
十进制二进制八进制十六进制
000000
100111
201022
301133
410044
510155
611066
711177
810001010
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
16100002010
17100012111
进制转换

(1)为什么要使用进制转换
计算机是由大量的电子元器件组成的, 电子器件的状态通常只有,打开和关闭, 所以用0和1,来表示状态. 计算机最终对于数据的处理都是处理的二进制数,但是人能看懂的是十进制,所以会用进制转换.
(2)十进制转N进制
方法: 连除倒取余
转N进制, 就是用这个数,除以N进制的基数, 一直除倒商为0为止, 此时,倒取每次的余数.
如:26转化为二进制

226
2130
261
230
211
01
结果:11010

如:53转为八进制

853
865
06
结果:65

如:160转十六进制

16160
16100
0A
结果:A0

(3)N转换成10进制
方法: 按权求和法

比如:十进制的563转十进制

   500      +     60    +     3
5 * 10 ^ 2  + 6 * 10^ 1 + 3 * 10^ 0

权:权重的意思, 10就是权.
位权: 权所在的位置, 位权自右向左,从0开始

二进制转十进制
1101 转十进制:

1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 13

八进制转十进制:
64:

6 * 8^1 + 4 * 8^0 = 52

十六进制转十进制:
CF

12 * 16^1 + 15 * 16 ^ 0 = 207

(4)N进制转N进制

一个八进制位,代表三个二进制位;
一个十六进制位,代表四个二进制位;
例子1:

	二进制转八进制:
    011110
    自右向左3个分开
    011 110
    3   6
    结果就是:36  

例子2:

  八进制转二进制:
    47
    每个八进制位用3个二进制位表示:
        100 111
    结果就是: 100111   

例子3:

二进制转十六进制
1001111
自右向左,4个分开,不足的补0
0100 1111
4    F
结果就是4F

例子4:

十六进制转二进制
BD
每一个十六进制位,用4个二进制位表示
1011 1101
结果就是:10111101

思考:如果8进制和16进制之间互转?

        16进制的AE转成八进制:
        先把AE换成2进制:
        1010 1110
        再自右向左3个分开:
        010 101 110
        2   5   6
        结果就是256

(5)二进制到10进制的快速转换。

比如8位2进制数
1   1   1  1 1 1 1 1
128 64 32 16 8 4 2 1
也就是每一位的1代表的数字
那么比如:
    1101转成十进制,快速口算:8 + 4 + 0 + 1 = 13;
    返过来:
        29转二进制,
        先把离29最近的二进制位置1,代表已经表示16了,还剩13,
        再把离13最近的8置,代表表示了8,还剩5,以此类推
         11101

(6)给出了一个数,如何得知它是几进制呢
十进制: 46, 89
二进制: 0b11011100
八进制: 073, 035
十六进制: 0x41, 0xA0
5,字节与位的关系
字节: byte
位: bit 二进制位,也叫比特位
1byte = 8bits;
1byte 最大存储容量,就是8个bit位全部为1时, 存储倒255
生活的一个例子:100M带宽,下载速度永远到不了100M,因为100M的单位是100Mbps(100M bits per seconds),而我们下载工具能看到最慢速率是byte,
所以最高下载速率,是100M的8分之1,大约12.5M

机器数,真值,原码,反码,补码

A,机器数:一个数在计算机中的二进制表示形式。(等同于原码)。
B,真值:这个数真正意义上的数值。(区别于形式值,形式值就是按位权求和得到的值。真值有符号位的概念,符号位要单拿出来,不能当数字看待。)
C,原码:就是机器数带符号位。

2的原码是 0b00000010
-2的原码是0b10000010

如果用原码进行2+(-2)的运算:

0b00000010
0b10000010 +
0b10000100

还原成真值得时候因为最高位是1, 认为是负数,最终得到的结果是-4. 和人类预期结果不一样,所以计算机就摒弃了使用原码进行运算方式, 引入了反码.
D,反码:正数的反码和原码一样,负数的反码是 符号位不变,其他各位取反。
+2的反码: 0b0000 0010(和原码一样)
-2 的反码: 0b1111 1101 (除了符号位不动, 其他各位取反)

0b0000 0010
0b1111  1101 +
0b1111 1111

还原成真值, 就是符号位不变, 其他位取反,得到0b1000 0000, 也就是对应-0, 达到了运算的目的,但是产生了歧义, 计算机出现了两个0, 一个+0, 一个-0, +0对应的二进制就是0b0000 0000, -0对应的二进制就是0b1000 0000, 虽然人知道+0和-0是同一个数,但是计算机认为是两个数.
所以,就引入了补码来解决计算机数据运算的问题.

E,补码:正数的补码等于原码。负数的补码等于负数的反码+1.
+2补码:

0b0000 0010 (补码和原码一样)

-2的补码

0b1000 0010(-2原码)
0b1111 1101 (取反码)
0b1111 1110(-2的补码)

2+(-2)使用补码进行运算

0b0000 0010(+2的补码)
0b1111 1110(-2 的补码)
0b100000000

因为我们是用1个字节进行运算, 相加之后就产生了溢出, 多出的一位就被截掉了,最终结果就是0b0000 0000
最重要的一点:
计算机中存储的数据是以二进制补码的形式存储的.
从内存中取出二进制数的时候, 需要还原成真值.
真值得还原过程(负数):
补码→ - 1→取反码→原码→真值.

位运算

(1)按位与 & 运算
对两个数的二进制位进行与&运算.
有0为0, 全1为1.

例子1:
    5 & 3
    0b0000 0101 (5的补码)
    0b0000 0011 (3的补码)
    0b0000 0001 (结果的补码)
    取真值:
        1
例子2:
    -5 & 3
    0b1000 0101(-5的原码)
    0b1111 1010(-5的反码)
    0b1111 1011(-5的补码)
    0b0000 0011(3的补码) &
    0b0000 0011(结果的补码)
    取真值:
        最高是0,是正数,3

例子3:
    -5 & -3
    0b1000 0101(-5的原码)
    0b1111 1010(-5的反码)
    0b1111 1011(-5的补码)
    
    0b1000 0011(-3的原码)
    0b1111 1100(-3的反码)
    0b1111 1101(-3的补码)
   0b1111 1011(-5的补码) &
   0b1111 1001(结果的补码) 
      取真值:
       最高位是1,是负数
       0b1111 1000 (-1)
       0b1000 0111 (取反)
       结果:-7 

思考题:
有任意一个1个字节的二进制数如0b1101 0011,如何把高四位清0,变成0b0000 0011?

让这个数&上0b0000 1111,就能把高四位清0

0b1101 0011
0b0000 1111 &
0b0000 0011

&运算作用,就是为了清0

(2)按位或 |
对两个数的二进制位进行或|运算.
有1为1, 全0为0.

7 | 9:
    0b0000 0111(7的补码)
    0b0000 1001(9的补码)
    0b0000 1111(结果的补码) |
    取真值:
        最高是0, 是正数, 结果就是15;

7 | -9:
    0b0000 0111(7的补码)
    
    0b1000 1001(-9的原码)
    0b1111 0110(-9的反码)
    0b1111 0111(-9的补码)
    0b0000 0111(7的补码) |
    0b1111 0111(结果的补码)
    
    取真值:
        最高是1,是负数
        0b1111 0110 (-1)
        0b1000 1001 (取反)
        结果-9;

思考题:
如何将任意一个1个字节的二进制数0b1011 0101 低四位全部置1?

把这个二进制数,或|上一个 0b0000 1111,就可以把低四位全部置1
或|运算的作用就是为了置1

(3)按位非(按位取反) ~
对一个二进制数逐位取反.

~ -10
0b1000 1010(-10的原码)
0b1111 0101(-10的反码)
0b1111 0110(-10的补码)

0b0000 1001(结果补码)
取真值:
    9
~ 4
0b0000 0100(4的原码)
0b1111 1011 (取反运算结果的补码) ~
取真值:
    最高位为1,为负数
    0b1111 1010 (-1)
    0b1000 0101 (取反)
    结果位:-5

公式:对A取反(取非运算)
结果: -(A+1)

(4)按位异或 ^
对两个数的二进制位进行异或^运算.
相异为1, 相同为0

-5 ^ -3
0b1000 0101 (-5的原码)
0b1111 1010 (-5的反码)
0b1111 1011 (-5的补码)

0b1000 0011 (-3的原码)
0b1111 1100 (-3的反码)
0b1111 1101 (-3的补码)
0b1111 1011 (-5的补码) ^
0b0000 0110 (结果的补码)
取真值:
    6;

(5)左移运算符 <<

0b 0000 0011
0b 0000 0011 << 1
0b 0000 0110 
结果是6

左移1位相当于乘以2
左移n位相当于乘以2^n

(6)右移运算符 >>

0b 0000 1000
0b 0000 1000 >> 1
0b 0000 0100 
结果是4

右移1位相当于除以2
右移n位相当于除以2^n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值