博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 中的进制转换、原码补码和反码、位运算
阅读量:5019 次
发布时间:2019-06-12

本文共 2863 字,大约阅读时间需要 9 分钟。

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

1.进制的组成

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

计算机存储数据时使用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 = xx ^ 1s = ~x  # 1s 是二进制位全部位 1 的数, 下同x ^ (~x) = 1sx ^ 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) == 1x & 1 == 1 or == 0 # x 清零最低位的 1x = x & (x - 1) # 得到最低为的 1x & -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 位置为 1x | (1 << n) # 5. 仅将第 n 位置为 0x & (~(1 << n)) # 6. 将 x 最高位至第 n 位(含)清 0x & ((1 << n) - 1) # 7. 将第 n 位至第 0 位(含)位清 0x & (~((1 << (n + 1)) - 1))

 

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

你可能感兴趣的文章
.net 查壳工具
查看>>
文本处理工具(一)基础处理
查看>>
LeetCode OJ - Evaluate Reverse Polish Notation
查看>>
Largest product in a grid( Project Euler problem 11)
查看>>
Arduino与水泵实验+土壤湿度传感器
查看>>
C# 嵌入CMD.exe
查看>>
SQL语言分为四类,每类分别是?各包括什么?
查看>>
理解Node.js安装及模块化
查看>>
程序员水平分级 你属于哪一类?
查看>>
按顺序获取key的值
查看>>
循环-16. 猴子吃桃问题(15)
查看>>
RSA工作原理
查看>>
温故而知新_C语言_前缀++(--)和后缀++(--)
查看>>
C# 接口
查看>>
C++STL - 函数模板
查看>>
django之Ajax
查看>>
20_学生选课数据库SQL语句练习题1
查看>>
jquery中innerheight outerHeight()与height()的区别
查看>>
confluence5.65+CentOS+mysql安装破解
查看>>
HDU ACM 1025 Constructing Roads In JGShining&#39;s Kingdom-&gt;二分求解LIS+O(NlogN)
查看>>