Day7
一、 进制
在计算机编程中,整数可以通过十进制,二进制,八进制和十六进制来表示
1、 十进制
基数:0,1,2,3,4,5,6,7,8,9,
进位:逢十进一
位权:123 = 100 + 20 +3 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0
2、 二进制
基数: 0,1
进位:逢二进一
位权: 100 = 1 * 2^2 + 0 * 2^1 + 0 * 2^0 = 5
3、 八进制
基数:0,1,2,3,4,5,6,7
进位:逢八进一
位权: 123(8) = 1 * 8^2 + 2 * 8^1 + 3 * 8^0 = 83
4、 十六进制
基数:0,1,2,3,4,5,6,7,8,9,a(10),b(11),c(12),d(13),e(14),f(15)
进位:逢16进1
位权:123(16) = 1 * 16^2 + 2 * 16^1 + 3 * 16^0 = 291
5、 程序中怎么表示不同进制的数
a. 在程序中直接的数字都是十进制
b. 0b+二进制数
c. 0o+八进制数
d. 0x+十六进制数
num = 1
num = 0b1
num = 0o1
num = 0x1
num = 100
print('十进制:%d,二进制:%s,八进制:%s,十六进制:%s, 将十进制转换为Unicode:%s' % (num, bin(num), oct(num), hex(num), chr(num)))
#十进制:100,二进制:0b1100100,八进制:0o144,十六进制:0x64,
将十进制转换为Unicode:d
二、 位运算
计算机存储数据只能存储数字数据,而且存的是数字的补码
计算机对数据进行运算的时候是使用补码进行运算的,将数据从计算机中读出来看到的是原码
1、 原码
符号位 + 真值
说明:
符号位: 最高为用0表示正数,1表示负数
真值:去掉正负,数字对应的二进制值
100 的原码:01100100
-100的原码:11100100
2、 反码
正数的反码:就是原码
负数的反码:原码的符号位不变,其余的位数取反(0->1,1->0)
100的反码:01100100
-100的反码:10011011
3、 补码
正数的补码:就是原码
负数的补码:反码+1
100的补码:01100100
-100的补码:10011100
-50的原码,反码,补码
原码:10110010
反码:11001101
补码:11001110
4、 为什么计算机要存补码
因为计算机中只有加法器,没有减法器
位运算:&(按位与),|(按位或),~(按位取反),^(按位异或),>>(右移),<<(左移动)
数字1 & 数字2 --> 每一位上的数是都为1结果就是1,有0就是0
0111(补) & 1101(补) --> 0101(补)
一个为上的数如果和1与,可以保留这个为上的数;和0与可以置0
应用:判断奇偶性,如果哟个数的二级制的最低位是1就是奇数,否则是偶数
数字 & 1 == 1 ->数字就奇数
print(3 & 2)
# 0011 & 0010 = 0010
print(-3 & -2)
# -3 : 1011 - > 1100 -> 1101
# -2 : 1010 - > 1101 -> 1110
# 1101 & 1110 = 1100 -> 1011 -> 1100
数字1 | 数字2: 只要有1结果就是1,两个都为0结果才是0
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
特点:和1或,置1
~数字 : 将数字上的每一位取反
~1 = 0
~0 = 1
数字1 ^ 数字2 : 相同为0,不同为0
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
应用:判断两个数是否相等。
数字1 << N :数字1左移N位,数字1 * 2**N
数字1 >> N :数字1右移N位,数字1 / (2 ** N)
应用:快速乘除2的倍数