python 中的进制转换、原码补码和反码、位运算

一. 2,8,10,16进制之间的转换

1.进制的组成

在计算机中,有四种进制,分别是 2进制、8进制、10进制和16进制。python

计算机存储数据时使用2进制,Unix系统中有些东西会使用8进制表示,计算机显示出来的通常都是10进制,十六进制通常用来简化2进制。算法

进制类型 组成 代码格式
2进制 由2个数字组成,有0 和 1 0b101
8进制 由8个数字组成,有0,1,2,3,4,5,6,7 0o127
10进制 有10个数字组成,有0,1,2,3,4,5,6,7,8,9 258
16进制 有16个数字组成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f (字母不区分大小写, a至f分别表明10,11,12,13,14,15) 0xff、0Xff、0XFF

 

 

 

 


 

 

2.进制转换

其余进制转换为10进制的计算公式:∑X * Yn;
其中 X 为第 n 位的数值,Y 为进制值[2, 8, 16],n为第几位,注意:n 是从 0 开始。 python 中用于进制转换的内置函数有:
  1. bin(x): 将 x 转为 2 进制.
  2. oct(x): 将 x 转为 8 进制.
  3. int(x, base=10): 将 x 转为 10 进制, 若是 x 是其余的进制数的字符串, 则 base 应为相应的进制数. 如 int("0b10100101", 2).也可使用 format 函数转化, 具体能够自行查阅.
  4. hex(x): 将 x 转为 16 进制. 

2.1.  2进制和10进制之间的转换

(1)2进制转化为10进制:
2进制如 0b10100101 转化为十进制时,运算为:1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^5 + 0*2^6 + 1*2^7= 1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165
在Python中,可使用 int 内置函数来转化为2进制,例如:int(0b10100101)

(2)10进制转化为2进制
用待除数(如 426)除以2,得出的结果再去不停地除以2,直到除完最后的结果小于2中止,,在把每一个阶段求得的余数从下到上依次拼接完毕便可。
在Python中,可使用 bin 内置函数来转化为2进制,例如:bin(98)

2.2  8进制和10进制之间的转换

(1)8进制转化为10进制:
将8进制(0o127)转换为10进制:运算为:7*8^0 + 2*8^1 + 1*8^2 = 7 + 16 + 64 = 87
在Python中,可使用 oct 内置函数来转化为2进制,例如:int(0o127)

(2)10进制转化为8进制
例如:用426除以8,得出的结果再去不停地除以8, 直到除完最后的结果小于8中止, 在把每一个阶段求得的余数从下到上依次拼接完毕便可
在Python中,可使用 oct 内置函数来转化为2进制,例如:oct(426)

2.3  10进制与16进制之间的转换

(1)16进制转化为10进制:
例如:带转化数为0xff ,运算为:15*16^0 + 15*16^1 = 255
在Python中,可使用 oct 内置函数来转化为2进制,例如:int(0x42a)

(2)10进制转化为16进制:
例如用426除以16,得出的结果再去不停地除以16, 直到除完最后的结果小于16中止, 在把每一个阶段求得的余数从下到上依次拼接完毕便可
在Python中,可使用 oct 内置函数来转化为2进制,例如:hex(426)

 

二. 原码、补码和反码

1.  简介

计算机的全部数据在底层都是以二进制的补码形式存储,实际人们看到的数字是原码转化来的,而原码是经过补码获得的。
即:补码 -> 原码 -> 最后人们看到的数。
进制转换的时候须要先把内存中存储的补码拿出来变成原码在进行转换输出。

正数高位补0
负数高位补1(前面空白位全是1)

数字 1 00000000 1 正数高位都补0
数字-1 11111111   1 负数高位都补1

原码: 用来转换对应进制
反码: 二进制码0变1,1变0叫作反码,反码用于原码补码之间的转换.(符号位不变)
补码: 用来作数据的存储运算. 补码提出的根源是让计算机底层的实现减法操做(能够表达出一个数的正负)

言外之意:计算机默认只会作加法,例:5+(-3) => 5 - 3 乘法除法:是经过左移 << 和右移 >> 来实现

2.  运算

正数: 原码 = 反码 = 补码
负数: 原码 = 补码取反+1 给补码求原码
负数: 补码 = 原码取反+1 给原码求补码
(原码 反码 补码之间的转换 , 符号位不要动)

 

三. 位运算 (偏算法)

前面提到, 计算机以二进制的形式存储的. 而位运算说穿了, 就是直接对整数在内存中的二进制位进行操做, 不须要转成 10 进制, 所以处理速度比较快.函数

1. 位运算经常使用的运算

  1. 与: &; 两位都为 1 时, 结果为 1, 不然为 0;
  2. 或: |; 两位都为 0 时, 结果为 0, 不然为 1;
  3. 异或: ^; 两位相同为 0, 相异为 1
  4. 取反: ~; 0 变 1, 1 变 0;
  5. 左移: <<; 各二进制位所有左移若干位, 高位丢弃, 低位补 0;
  6. 右移: >>; 各二进制位所有右移若干位, 低位丢弃, 高位补 0; (有符号数, 各编译器处理方法不同, 有的补符号位(算术右移), 有的补 0 (逻辑右移))

2. 异或操做的特色

x ^ 0 = x
x ^ 1s = ~x  # 1s 是二进制位所有位 1 的数, 下同
x ^ (~x) = 1s
x ^ x = 0
# 若是 a ^ b = c, 那么 a^c = b, b^c = a 成立, 交换律
a ^ b = c  # ==> a^c = b, b^c = a
# 结合律
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c

3. 经常使用的位运算操做

# 判断奇偶, 至关于 (x % 2) == 1
x & 1 == 1 or == 0
# x 清零最低位的 1 x = x & (x - 1)
# 获得最低为的 1 x & -x

4. 更复杂的位运算操做

# 1. 将 x 最右边的 n 位 清零
x & (~0 << n)
# 2. 获取 x 的第 n 位值 (0 或 1) (x >> n) & 1
# 3. 获取 x 的第 n 位的幂值 x & (1 << (n - 1))
# 4. 仅将第 n 位置为 1 x | (1 << n)
# 5. 仅将第 n 位置为 0 x & (~(1 << n))
# 6. 将 x 最高位至第 n 位(含)清 0 x & ((1 << n) - 1)
# 7. 将第 n 位至第 0 位(含)位清 0 x & (~((1 << (n + 1)) - 1))
相关文章
相关标签/搜索