一、进制
计算机在存储数字的时候都是以二进制的形式存储的
十进制 | 二进制 | 八进制 | 十六进制 | |
---|---|---|---|---|
基数 | 0,1,2,3,4,5,6,7,8,9 | 0,1 | 0,1,2,3,4,5,6,7 | 0-9,a-f(A-F) |
进位 | 逢10进1 | 逢2进1 | 逢8进1 | 逢16进1 |
每位的值 | 111 = 1 * 10^0 + 1* 10^1 + 1 * 10^2 = 111 | 111 = 1 * 2^0 + 1 * 2^1 + 1 * 2^2 = 7 | 111 = 1 * 8^0 + 1 * 8^1 + 1 * 8^2 = 73 | 111 = 1 * 16^0 + 1 * 16^1 + 1 * 16^2 = 273 |
进制之间的转换
-
a.其他进制转换成10进制:每一位上的数乘以进制幂次数,然后求和
例:111 = 1 * 16^0 + 1 * 16^1 + 1 * 16^2 = 273 -
b.十进制转其他进制:
辗转取余法(不断除以进制取余,直到除到商为0为止,从最后取的余数开始写(最后取的写高位))
例:十进制转二进制: 123:(2) 1111011 60:(2) 111100
例:十进制转八进制: 123:(8) 173
例:十进制转十六进制: 123:(16) 7B -
c.二进制转八进制:每3位二进制转换成1位
八进制转二进制:每1位8进制转换成3位的二进制
(8)67 --> (2) 110 111 -
d.二进制转十六进制:每4位二进制转换成1位
十六进制转二进制:一位的16进制转换成4位的二进制
(16)67 --> (2) 0110 0111 -
e.十六进制和八进制互转:都先转换为二进制,再转换为八/十六进制
python对进制的支持
python支持通过二进制、八进制、十进制和十六进制的形式来直接表示整数
- a.十进制:直接写的数字的值都是十进制的数
10
100
76
# 78a #SyntaxError: invalid syntax
- b.二进制:需要加前缀 -> 0b
0b1010
- c.八进制:需要加前缀 -> 0o
0o67
# 0o68 # SyntaxError: invalid syntax
- d.十六进制:需要加前缀 ->0x/0X
0x78af
0Xdf3
各进制数可以参与运算,在计算机底层统一为二进制计算,以10进制返回结果
num = 0b1101 + 0xaf2
print(num) # 2815
- e.python中进制的转换(结果是字符串)
bin(整数) --> 将括号中的整数,转换成二进制形式的数
print(bin(100),bin(0o56),bin(0xdf2)) # 0b1100100 0b101110 0b110111110010
print(type(bin(100))) # <class 'str'>
oct(整数) --> 将括号中的整数,转换成八进制形式
print(oct(100),oct(0b0111),oct(0xdf2)) # 0o144 0o7 0o6762
hex(整数) --> 将括号中的整数,转换成十六进制形式
print(hex(100),hex(0b11010111),hex(0o763)) # 0x64 0xd7 0x1f3
二、原码、反码和补码
计算机在存数字的时候,存的是数字的二进制的补码
计算机内存的最小单位是位:1位只能存储两个状态
8位 = 1字节
C语言int型(32位)数字1:
00000000 00000000 00000000 00000001
-
a.原码:整数数字的二进制形式
十进制的10的原码:1010
最高位是符号位,如果是整数符号位为0,负数符号位为1
10的原码 00000000 00001010
-10的原码 10000000 00001010 -
b.反码
正数的反码是它的原码
负数的反码就是这个数的原码的符号位不变,然后其他位置上的数取反(0->1,1->0)
-10 -> (原码)10000000 00001010 -> (反码) 11111111 11110101 -
c.补码
正数的补码就是它的原码
负数的补码就是它的反码加1
-10 -> (反码) 11111111 11110101 -> (补码) 11111111 11110110
总结:正数的反码和补码都是原码;负数的补码是反码加1,反码是原码符号位不变,其他位取反
为什么计算机存储数据的时候存补码?:计算机只有加法器,只能进行加操作,存原码对负数进行加操作的时候有问题
三、位运算
计算机存数字存补码,计算的时候也是补码,最后结果看的时候看原码
位运算符:&(按位与),|(按位或),^(异或),~(取反),>>(右移),<<(左移)
- &(按位与):
数字1 & 数字2:二进制的每一位,两个都为1,结果才是1,否则为0
3 & 2 --> 00000011 & 00000010 == 00000010
-3 & 2 --> 11111101 & 00000010 == 00000000
print(3&2) # 2
print(-3&2) # 0
作用:让指定位上数置零,或者保留某一位上的值
- |(按位或)
数字1 | 数字2:二进制的每一位,只要有一个位1,结果就是1,;两个都为0,结果才是0
3 | 2 --> 00000011 | 00000010 == 00000011
-3 | 2 --> 11111101 | 00000010 == 1111 1111(补码) == 1111 1110(反码) == 1000 0001(原码)
print(3|2) # 3
print(-3|2) # -1
- ^(异或)
数字1 ^ 数字2:二进制的每一位,不同为1,相同为0
3 ^ 2 --> 00000011 ^ 00000010 == 00000001
-3^2 --> 1111 1101 ^ 00000010 == (补)1111 1111 == (原)1000 0001
print(3^2) # 1
print(-3^2) # -1
- ~(取反)
~数字:将每一位取反
~3 ---> ~00000011 = 11111100(补) = 1111 1011(反) = 1000 0100(原)
~-3 ---> ~1111 1101 = 0000 0010
print(~3) # -4
print(~-3) # 2
- << (左移)
数字 << 位数:将补码向左移动指定的位数,在最后面补指定个数的0
(摘自CSDN)负数的左移:和整数左移一样,在负数的二进制位右边补0,一个数在左移的过程中会有正有负的情况,所以切记负数左移不会特殊处理符号位。如果一直左移,最终会变成0。
- 规律(正数和负数都适用):m << n == m * (2^n)
print(-10 << 1) # -20
print(10 << 3) # 80
num * 2
推荐使用 num << 1
,位运算效率高,执行速度快
-
>>
(右移)
数字 >> 位数:将补码向右移动指定的位数,符号位不变,在符号位的后面补指定个数的0(正数)或者1(负数)
- 规律(只适用于正数)m >> n == m // (2^n)
print(10 >> 1) # 5
print(10 >> 2) # 2
print(-10 >> 1) # -5
print(-10 >> 2) # -3
# 练习:
# print(-15 >> 1)
# print(17 << 2)
四、认识字符
字符串(str)
1. 什么是字符串
python中通过单引号或者双引号引起来的字符集就是字符串
字符串中引号中的字符集,就是由各种不同的字符来组成的
例:
'老白干'
"welcome"
"^_^"
'1234'
'in'
'82年拉菲'
2. Unicode编码
python中的字符串中的字符采用的是Unicode编码
Unicode编码:是通过两个字节来对一个字符进行编码,0 ~ (2^16-1)(65535),几乎包含了世界上所有的符号
ASCII编码:通过一个字节来对一个字符进行编码
Unicode编码中包含了ASCII码表
print(2**16-1)
'a' --> 97
'b' --> 98
- chr(数字):获取数字在Unicode编码表中对应的字符
print(chr(97)) # a
print(chr(0x1897)) # ᢗ
for i in range(0x0900,0x0980):
print(chr(i),end='')
print('')
- ord(字符):获取字符对应的Unicode码
print(ord('余'),ord('笑'),ord('宇')) # 20313 31505 23431
可以直接在字符串中写字符对应的编码值,格式:\u四位的十六进制的编码值(不带0x前缀)
str1 = '\u4f59'
str2 = '\u4f59\u7b11\u5b87'
print(str1) # 余
print(str2) # 余笑宇
3. 转义字符(适用于所有语言)
一些特殊功能和具有特殊意义的字符,直接放在字符串的引号中无效,需要通过\来转义
\n
--> 换行
\'
--> '
\t
--> 制表符(相当于tab)
\\
--> \
\"
--> "
注意:转义字符是一个字符
str3 = 'dfsf\nfsfwe'
print(str3)
# dfsf
# fsfwe
网友评论