一、进制
计算机在存储数据的时候都是以二进制的形式去存储的
十进制、十六进制、八进制、二进制
1、十进制
123、4、65、34255765879808
基数:0、1、2、3、4、5、6、7、8、9;
进位:逢10进1;
每一位的值:123=1 * 100+2 * 10+3 * 1=1 * 10^2 + 2 * 10^1+ 3 * 10^0
2、二进制
所有二进制数都是由0和1组成; 1011、1100
基数:0、1;
进位:逢2进1;
每一位的值: 11011 =1 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0=27
print(1 * 2 ** 4+1 * 2 ** 3+0 * 2 ** 2+1 * 2 ** 1+1 * 2 ** 0) #27
即(二进制)11011=(十进制)27
3、八进制
基数:0、1、2、3、4、5、6、7
进位:逢8进1;
每一位的值: 3415 =3 * 8^3 + 4 * 8^2 + 1 * 8^1 + 5 * 8^0=1805
print(3 * 8 ** 3 + 4 * 8 ** 2 + 1 * 8 ** 1 + 5 * 8 ** 0) #1805
即(八进制)3415=(十进制)1805
4、十六进制
基数:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
进位:逢16进1;
每一位的值: 111 =1 * 16^2 + 1 * 16^1 + 1 * 16^0 = 273
print(1 * 16 ** 2 + 1 * 16 ** 1 + 1 * 16 ** 0) #273
即(十六进制)111=(十进制)273
5、进制之间的转换
a、其他进制转换成10进制:每一数位上的数乘以进制的慕次数,然后求和;
b、10进制转换成其他进制:辗转取余法;
例如 十进制转换二进制:
即十进制的数字30转换成二进制为11110;
例如十进制转换八进制:
即十进制的数字30转换成八进制为36;
c、2进制转换8进制:从右往左取数,每取3位二进制转换成1位八进制;
例如: 1 111 111=100* (1* 2^0)+ 10* (1* (2^2+ 2^1+ 2^0 ))+1* (2^2 +2^1 +2^0)=177
d、2进制转换16进制:从右往左取数,每取4位二进制转换成1位十六进制;
例如: 111 1101=0111 1101=
10* (0* 2^3 +1* (2^2 +2^1 +2^0)) +1* (2^3 + 2^2 +2^0)+ 0*2^1=7d;
e、8进制转换2进制:从右往左取数,每取1位八进制转换成3位二进制;
f、16进制转换成2进制:从右往左取数,每取1位十六进制转换成4位二进制;
6、Python对进制的支持
Python支持通过二进制、八进制、十进制、十六进制的形式来直接表示整数;
a、十进制:直接写入的数字的值都是十进制的数;
b、二进制:需要在数字前面加前缀————>0b(零B)
print(0b1111) #15(十进制)
c、八进制:需要在数字前面加前缀————>0o(零欧)
print(0o765) #501(十进制)
d、十六进制:需要在数字前面加前缀————>0x(零叉)
print(0xda23) #55843(十进制)
e、进制的转换(结果是字符串,非数字)
bin(整数)————>将括号内的整数,转换成二进制形式的数
print(bin(31)) #十进制31转二进制 11111
print(bin(0o4327)) #八进制4327转二进制 100011010111
otc(整数)————>将括号内的整数,转换成八进制形式的数
print(oct(31)) #十进制31转八进制37
print(oct(0o4327)) #八进制4327转八进制4327
hex(整数)————>将括号内的整数,转换成十六进制形式的数
print(hex(31)) #十进制31转十六进制 1f
print(hex(0o4327)) #八进制4327转十六进制 x8d7
二、原码、反码和补码
计算机在存数字的时候,存的是数字的二进制的补码
计算机内存的最小单位是位:1位只能存储两个状态
8位 = 1字节
a、原码:整数数字的二进制形式
十进制的10的二进制原码就是:1010
最高位是符号位,如果正数符号位为0,负数符号位为1
以16位存储数字的二进制为例
10的原码 00000000 00001010
-10的原码 10000000 00001010
b、反码
正数的反码是它的原码
负数的反码就是这个数的原码符号位不变,然后其他位置上的数取反(0->1,1->0)
-10 -> (原码)10000000 00001010 ->(反码)11111111 11110101
c、补码
正数的补码就是它的原码
负数的补码是它的反码加1
-10 -> (反码)11111111 11110101 -> (补码)1111111 11110110
d、总结:正数的反码和补码都是原码;负数的补码是其反码加1;反码是原码符号位不变,其他位取反;
问题:为什么计算机存储数据的时候存补码?
答:因为计算机中只有加法器,只能进行加操作。
计算机存储数字存的是其补码,其加计算也是在补码上完成的,
但最后结果反馈给人们看的时候,
我们需要看原码,因为补码无法直观展示大小;
原码、反码和补码的意义:原码是反馈给人们直观看的;
反码是一个中间值,目的在于求出补码以及返回原码;
补码是用来给计算机进行加操作的;
三、位运算
计算存储数字存补码,计算的时候也是补码,最后我们看结果看的是原码
位运算符:&(按位与),|(按位或), ^(异或), ~(取反), >>(右移), <<(左移)
1、&(按位与)
数字1 & 数字2 :两个都为1结果才是1,否则为0;
3 & 2 --> 0000 0011 & 0000 0010 == 0000 0010
-3 & 2 --> 1111 1101 & 0000 0010 == 0000 0000
print(3&2) #2
print(-3&2) #0
作用:让指定位上数置零,或者保留某一位上的值;
2、|(按位或)
数字1 | 数字2: 只要有一个为1,结果就是1;两个都为0,结果才是0
3 | 2 --> 0000 0011 | 0000 0010 = 0000 0011
-3 | 2 --> 1111 1101 | 0000 0010 = (补)1111 1111 = (原)1000 0001
print(3|2) #3
print(-3|2) #-1
3.^(异或)
数字1 ^ 数字2: 不同为1,相同为0
3^2 --> 0000 0011 ^ 0000 0010 = 0000 0001
-3^2 --> 1111 1101 ^ 0000 0010 = (补)1111 1111 = 1000 0001
print(3^2) #1
print(-3^2) #-1
4.~(取反)
~数字:将每一位取反
~3 ---> ~0000 0011 = 1111 1100(补) = 1000 0100
~-3 ---> ~1111 1101 = 0000 0010
print(~3) #-4
print(~-3) #2
5.左移(重点掌握)
数字 << 位数: 将补码向左移动指定的位数,
符号位不变,在最后面补指定个数的0
规律(正数和负数都实用):m << n == m * (2^n)
print(10 << 1) # 20 10*2^1=20
print(-10 << 1) # -20 -20*2^1=-20
print(2 << 2) # 8 2*2^2=8
print(-23 << 2) # -92 -23*2^2=-92
# num * 2 == num << 1 ; num * 4 == num << 2
6.右移
数字 >> 位数: 将补码向右移动指定的位数,符号位不变,
在符号位的后面补指定个数的0(正)或者1(负)
规律(只适用于正数):m >> n == m // (2^n)
规律(只适用于能整除的负数):m >> n == m //(2^n)
规律(只适用于不能整除的负数):m >> n == m // (2^n)-1
print(10 >> 1) #5 10/2^1=5 (正数)
print(10 >> 2) #2 10//2^2=2 (正数)
print(-10 >> 1) #-5 -10//2^1=-5 (能被整除的负数)
print(-10 >> 2) #-3 -10//2^2-1=-3 (不能被整除的负数)
四、字符串
1、字符串(str)
定义:Python语言中,通过单引号或者双引号引起来的字符集就是字符串;
字符:字符串里的字符集,就是由各种不同的字符组成的;
例如:'fhoifjskddsjfsdsflds' '2132436570787'
'发挥而疯狂的说法房间欧萨就发你是否对' 'がいに' '关键字'
2、Unicode编码
Python中的字符串的字符采用的是Unicode编码;
Unicode编码:通过两个字节来对一个字符进行编码,
即可对0~2^16-1(65535)个字符进行编码,。它几乎包含了世界上所有的符号;
ASCII编码:通过一个字节来对一个字符进行编码;
Unicode编码中包含了ASCII编码表;
chr(数字):获取括号内的数字在Unicode编码表中对应的字符,
返回的是只有一个字符的字符串;
print(chr(4)) #EOT
ord(字符):获取字符对应的编码值;
print(ord('蒋')) #33931
注意:也可以直接获取字符对应的编码值,格式:\u十六进制的编码值;
n1='gfr\u3124\ua23d积分';
print(n1);
3、转义字符
一些特能和具有特殊意义的字符,直接放在字符串的引号中无效,需通过\来转义;
print("hello\"world") # hello"world 中间双引号之前不加\,会报语法错误
\n表示换行;
print('好粉丝费\n分手就分手') #在\n所处位置换行