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

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

1.进制的组成

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

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

进制类型组成代码格式
2进制由2个数字组成,有0 和 10b101
8进制由8个数字组成,有0,1,2,3,4,5,6,70o127
10进制有10个数字组成,有0,1,2,3,4,5,6,7,8,9258
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))

 

转载于:https://www.cnblogs.com/trent-fzq/p/10889959.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值