Day-3 - 进制和字符串(2018-09-27)

2018-09-27  本文已影响0人  雨雨雨90

一、进制

计算机在存储数字的时候都是以二进制的形式存储的

十进制 二进制 八进制 十六进制
基数 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

进制之间的转换

python对进制的支持

python支持通过二进制、八进制、十进制和十六进制的形式来直接表示整数

10  
100
76
# 78a #SyntaxError: invalid syntax
0b1010
0o67
# 0o68 # SyntaxError: invalid syntax
0x78af
0Xdf3

各进制数可以参与运算,在计算机底层统一为二进制计算,以10进制返回结果

num = 0b1101 + 0xaf2
print(num) # 2815

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

总结:正数的反码和补码都是原码;负数的补码是反码加1,反码是原码符号位不变,其他位取反

为什么计算机存储数据的时候存补码?:计算机只有加法器,只能进行加操作,存原码对负数进行加操作的时候有问题

三、位运算

计算机存数字存补码,计算的时候也是补码,最后结果看的时候看原码

位运算符:&(按位与),|(按位或),^(异或),~(取反),>>(右移),<<(左移)

  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. |(按位或)
    数字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. ^(异或)
    数字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
  1. ~(取反)
    ~数字:将每一位取反
    ~3 ---> ~00000011 = 11111100(补) = 1111 1011(反) = 1000 0100(原)
    ~-3 ---> ~1111 1101 = 0000 0010
print(~3) # -4
print(~-3) # 2
  1. << (左移)
    数字 << 位数:将补码向左移动指定的位数,在最后面补指定个数的0
    (摘自CSDN)负数的左移:和整数左移一样,在负数的二进制位右边补0,一个数在左移的过程中会有正有负的情况,所以切记负数左移不会特殊处理符号位。如果一直左移,最终会变成0。
print(-10 << 1) # -20
print(10 << 3) # 80

num * 2 推荐使用 num << 1,位运算效率高,执行速度快

  1. >> (右移)
    数字 >> 位数:将补码向右移动指定的位数,符号位不变,在符号位的后面补指定个数的0(正数)或者1(负数)
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

print(chr(97)) # a
print(chr(0x1897)) # ᢗ
for i in range(0x0900,0x0980):
    print(chr(i),end='')
print('')
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
上一篇 下一篇

猜你喜欢

热点阅读