进制
计算机在存储数字的时候都是以二进制的形式去存的
十进制、十六进制、八进制、二进制
1.十进制
基数:0~9
进位:逢十进一
每一位的值:123 = 1 * 100 + 2 * 10 + 3 * 1 = 1 * 10 ^ 2 + 2 * 10 ^ 1 + 3 * 10 ^ 0
例:100 78 2 938 8980799
例:
111 = 1 * 10 ^ 0 + 1 * 10 ^ 1 + 1 * 10 ^ 2 = 111
2.二进制
基数:0,1(所有的二进制都是由0和1组成)
进位:逢二进一
每一位的值:11011 = 1 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 + 1 * 2 ^ 3 + 1 * 2 ^ 4 = 27
例:1100 1011 11111111 11001111
例:
111 = 1 * 2 ^ 0 + 1 * 2 ^ 1 + 1 * 2 ^ 2 = 7
3.八进制
基数:0~7
进位:逢八进一
每一位的值:0213 = 3 * 8 ^ 0 + 1 * 8 ^ 1 + 2 * 8 ^ 2 = 139
例:777 67 271
例:
111 = 1 * 8 ^ 0 + 1 * 8 ^ 1 + 1 * 8 ^ 2 = 73
4.十六进制
基数:0~9 AF(af)
进位:逢十六进一
每一位的值:0x28E = 14 * 16 ^ 0 + 8 * 16 ^ 1 + 2 * 16 ^ 2 = 657
例:28EF EF FF 20AB
例:
111 = 1 * 16 ^ 0 + 1 * 16 ^ 1 + 1 * 16 ^ 2 =273
5.进制之间的转换
a.其他进制转换成十进制:每一位上的数乘以进制幂次数,然后求和
b.十进制转其他进制:辗转取余法
123:(2)01111011
[图片上传失败...(image-899994-1539944288924)]
123:(8)173
[图片上传失败...(image-b6a4fa-1539944288924)]
123:(16)7B
[图片上传失败...(image-c9c5e8-1539944288924)]
c.二进制转八进制:每三位二进制数转换成一位的八进制数(每三位二进制计算一次)
例:
(2)001 111 011--->(8)123
八进制转二进制:一位八进制数转换成三位的二进制数
例:
(8)671--->(2)110 111 001
d.二进制转十六进制:每四位二进制转换成一位十六进制(每三位二进制计算一次)
例:
(2)0111 1011--->(16)7B
十六进制转二进制:一位十六进制转换成四位的二进制
例:
(16)671--->(2)0110 0111 0001
e.八进制转十六进制或十六进制转八进制
可以先将八进制(十六进制)转换成二进制,再将二进制转换成十六进制(八进制)
6.python对进制的支持
python支持通过二进制、八进制、十进制、十六进制的形式来直接表示整数
(会先在后台转换成二进制,计算出结果后会转成十进制显示出来)
a.十进制:直接写的数字的值都是十进制的数
10
100
76
b.二进制:需要加前缀->0b
0b1010
0b1110
c.八进制:需要加前缀->0o/0O
0o56
0o77
d.十六进制:需要加前缀->0x/0X
0x56F
0x56fa
0xFFBA
e.进制的转换
bin(整数) --> 将括号中的整数,转换成二进制形式的数
print(bin(10),bin(0o56),bin(0xaf))
0b1010 0b101110 0b10101111
oct(整数) --> 将括号中的整数,转换成八进制形式的数
print(oct(10),oct(0b11011001),oct(0xaf))
0o12 0o331 0o257
hex(整数) --> 将括号中的整数,转换成八进制形式的数
print(hex(10),hex(0b11011001),hex(0o78))
0xa 0xd9 0x3b
原码反码和补码
计算机在存数字的时候,存的是数字的二进制的补码。
计算机最小的内存单位是位,1位只能存储两个状态。
位等价于比特(bit),是同一个单位。
8位 = 1字节(Byte)
8比特(bit) = 1字节(Byte)
(ps:一个数在计算机中的二进制表示形式,叫做这个数的机器数,机器数的形式值就不等于真正的数值?;魇牛罡呶淮娣欧?,正数为0,负数为1)
a.原码
数字的二进制形式
十进制的10(十)的原码就是1010
最高位是符号位,正数符号位为0,负数的符号位为1
10的原码:0000 0000 0000 1010(两个字节的存储空间)
-10的原码:1000 000 0000 1010
b.反码
正数的反码是其本身
负数的反码就是这个数的原码符号位不变,然后其他位置上的数按位取反(0->1,1->0)
-10-->(原码)10000000 00001010 -->(反码)11111111 11110101
c.补码
正数的补码就是其本身
负数的补码就是它的反码加1
-10 --> (反码)11111111 11110101 + 1 --> (补码)11111111 11110110
总结:
- 原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
- 反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
- 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(即在反码的基础上+1)
(ps:负数计算时用补码进行计算)
位运算
位运算符:&(按位与), |(按位或), ^(异或), ~(按位取反), >>(右移), <<(左移)
a.&(按位与)
数字1 & 数字2 :二进制的每一位,两个都为1结果才为1,否则为0
例:
3 & 2 -->0000 0011 & 0000 0010 == 0000 0010
-3 & 2 -->1111 1101(补码) & 0000 00010 == 0000 0000
作用:让指定位上的数置零,或者保留某一位上的值
b.|(按位或)
数字1 | 数字2 :只要有一位上的数为1,结果就为1;两个都为0,结果才为0。
3 | 2 -->0000 0011 | 0000 0010 == 0000 0011
-3 | 2 -->1111 1101(补码) | 0000 00010 == 1111 1111(补码) == 1000 0001(原码)
(1111 1111 - 1 == 1111 1110,首位不变再取反就是原码,即1000 0001)
c.^(异或)
数字1 ^ 数字2:不同为1,相同为0
3 ^ 2 -->0000 0011 ^ 0000 0010 == 0000 0001
-3 ^ 2 -->1111 1101(补码) ^ 0000 00010 == 1111 1111(补码) = 1000 0001 (原码)
(1111 1111 - 1 == 1111 1110,首位不变再取反就是原码,即1000 0001)
d. ~(按位取反)
~数字:将每一位取反
~3 --> ~0000 0011 = 1111 1100 (符号位变,即变为了补码)= 1000 0100
~-3 --> ~1111 1101(补码) = 0000 0010 (符号位变,即变为了补码)
(所得数符号位为0,为正数,正数的原码==反码==补码)
e.>>(右移)
数字 >> 位数:将补码向右移动指定的位数,符号位不变,在符号位的后面补指定个数的0(正数)或者1(负数)
移位后,前面空出来的位置,正数补0,负数补1。
规律(适用于正负数):m << n == m // (2^n)
(如果是负数,可以先当做正数计算,得到的结果四舍五入再加负号)
print(10 >> 1)
print(-10 >> 1)
print(-10 >> 2)
5
-5
-3
f.<<(左移)(重点掌握)
数字 << 位数:将补码向左移动指定位数,符号位不变,在最后面补指定个数的0(正数)或者1(负数)。
规律(正负数都适用):m << n == m * (2^n)
例:
print(10 << 3)
print(-10 << 2)
print(2 << 2)
print(-23 << 2)
80
-40
8
-92
字符串(str)
1.什么是字符串
python中通过单引号或者双引号引起来的字符集就是字符串。
字符串中引号中的字符集,就是由各种不同的字符来组成的
例:
'jhadk'
'2376'
'3827dhj'
'小呆'
'&……%*……&('
"hakhfaj"
"8923jhfdn"
"鄂小呆"
2.Unicode编码
python中字符串中字符采取的是Unicode编码
Unicode编码:是通过两个字节来对一个字符进行编码,0 ~ 2^16-1(65535)。它几乎包含了世界上所有的符号。
ASCII编码:是通过一个字节来对一个字符进行编码
Unicode编码中包含了ASCII码表
chr(数字):获取数字在Unicode编码表中对应的字符,返回的是只有一个字符 的字符串
print(chr(97))
print(chr(0x1342))
a
?
ord(字符):获取字符对应的Unicode编码
print(ord('鄂'), ord('小'))
print(ord('錒'))
37122 23567
37650
可以直接在字符串中写字符对应的编码值,格式:\u十六进制的编码值
例:
str1 = '\u4e00\u4e01'
print(str1)
乕乷
3.转义字符(适用于所有语言)
一些特有功能具有特殊意义的字符,直接放在字符串的引号中无效,需要通过\来转义
制表符 | 含义 |
---|---|
\n | 换行 |
' | ' |
" | " |
\t | 制表符(相当于TAB) |
\ | \ |
例:
str1 = 'hello\'world' -----> hello'world
str2 = '\tjkba' -----> jkba
str3 = 'akjdba\nkj' ----->akjdba
kj