一:进制
在计算机编程中,整数可以通过二进制,八进制,十进制,十六进制
十进制可通过方程转二、八、十六进制。倒转需要先转成二进制再转。
二进制可通过方程转十、八、十六进制。
1.十进制
基数:0,1,2,3,4,5,6,7,8,9
进位:逢十进1.
位权:123(10) = 1 *10^2 + 2 *10^1 + 3 *10^0
2.二进制
基数:0,1
进位:逢二进一
100(2)==4(10) 二进制的100 == 十进制的4
位权:101(2) = 1 *2^0 + 0 *2^1 + 1 *2^2 # ^次方符号。
十进制转二控制,可用位权方程。N是2的几次方最大值,剩下的数再2的几次方,是2的几次方就是第几位数上记1,无的记0.
3.八进制
基数:0,1,2,3,4,5,6,7
进位:逢八进一
位权:123(8)= 3 *8^0 + 2 *8^1 + 1 *8^2
`123(10)转八进制 ,8**2 =64 ,
123 - 64 = 63 , 7 * 8**1 =56
63 - 56 = 3 , 3 * 8**0 =3
结果即123十进制转八进制等于 173`
4:十六进制
基数:0,1,2,3,4,5,6,7,8,9, a/A(10) ,b,c,d,e,f,(也可以大写)
进位:逢16进一
位权:123(16) = 3 *16^0 + 2 *16^1+ 1 *16^2
1.程序中怎么表示不同进制的数
a.在程序中直接写的数字都是十进制。控制台打印出来的数字都是十进制的。 0后面的字母也可以是大写的
b.二进制
0b/B + 二进制数
num = 0b01001110
print(num) #控制台打印出来会显示十进制数。
print(bin(78)) #获取一个数对应的二进制数,控制台打印出来是字符串。
print(bin(0x123af)) #把十六进制转二进制
print(bin(0o123)) #把八进制转二进制
八进制转二进制,每一位八进制数转成三个二进制数。(8是2的3次方)
十六进制转二进制,每一位十六进制转成四个二进制数。(16是2的4次方)
c.八进制
0o/o + 八进制数
num = 0o1345
print(oct(800)) #把十进制转成八进制
d.十六进制
0x/X + 十六进制
num = 0x23af
print(hex(12357)) #转成16进制
print(ord('一'))
print('aaa\uffffl')
print(hex(0o123))
二:原码、反码、补码
计算机只能存二进制的补码。
计算机存数据只能存数字数据,而且只能存数据的二进制的补码。
计算机对数据进行的运算的时候是使用补码进行运算的,将数据从计算机中读出来看到的是原码。
1.原码:
符号位 + 真值
说明:
符号位:最高位用0表示正数,用1表示负数。
真值:去掉正负符号后,数字的二进制值。
100的原码:01100100(第一位0代表正数)
-100的原码:11100100(第一位1代表负数)
2.反码:
正数的反码:就是原码
负数的反码:原码的符号位不变,其他位数取反。(取反0变成1,1变成0)
100的反码:01100100(第一位0代表正数)
-100的反码:10011011(第一位1代表负数)
3.补码:
正数的补码:就是原码
负数的补码:反码加1.
100的补码:01100100
-100的补码:10011100
print(bin(-50)) 原码 1110010 ---- 反码 1001101 ---- 补码 1001110
4.为什么计算机要存补码?
因为计算机中只有加法器,没有减法器。
3-2 --->3 + (-2)
3的原码:011 -2的原码:110 3-2 = 011 + 110 = 001
2-3---> 2+(-3) = 110 + 011 = 001 = 1 #用原码计算,有负数时则出错。
-3原码:1011 反:1100 补:1101
-2原码:1010 反:1101 补:1110
三:位运算(二进制计算)
位运算:&(按位与(数字7)),|(按位或运算),~(按位取反),^(按位异或),>>(右移),<<(左移)
数字1 & 数字2-->两位上的数都为1结果就是1,有0结果就是0.
0111(补) & 1101(补) --> 0101(补)
1.特点:一个位上的数如果和1与,可以保留这个位上的数; 和0与可以置0
2.应用:判断一个数的奇偶 (如果一个数的二进制最低位是1是奇数,否则就是偶数)
num & 1 == 0 #(偶数) (一个数&1,结果是二进制的最后一位。)
num & 1 == 1 #(奇数)
print(3 & 1)
print(100 & 1)
数字1 | 数字2: 只要有1结果就是1,两个都为0结果才是0
特点:和1或,置1.
print(3|2) #0011 | 0010 = 0011(补)
~ 数字 : 将数字上的每一位取反。
~ 1 = 0 ,,,~0 = 1
print(~3) # ~0011 = 1100(补) =1011(反) = 1100
print(~-4)
~~3 = 3 #取反两次等于他本身。
数字1 ^ 数字2 :两个数相同为0,不同为1.
应用:加密。快速判断两个数是否相等:相同的两个数异或结果是0
print(3^2) # 0011^0010 = 0001 = 1
print(1^2) #1^2 = 3
数字1 << N : 数字1左移N位,数字1 * 2**N
数字1 >> N : 数字1右移N位。数字1 // 2**N
应用:快速乘2的次方/除2的次方。
print(4<<1) #8
print(-3 << 2) #-12
print(5>>2) #1
网友评论