python中的进制和位运算

本文深入解析了计算机科学中的进制概念,包括十进制、二进制、八进制和十六进制的表示与转换,以及它们在编程中的应用。同时,详细介绍了二进制的原码、反码、补码及其存储和运算原理,阐述了位运算符的功能与应用场景,如快速判断奇偶性和数值乘除操作。

一、进制

在计算机编程中,整数可以通过十进制、二进制、八进制和十六进制来表示

1、十进制

基数:0、1、2、3、 4、 5、 6、 7、 8、 9

进位:逢10进1

位权:例如:123 = 100 + 20 + 3

2、二进制

基数:0、1

进位:逢2进1

位权:例如:1100 = 8+ 4 + 0 + 0

3、八进制

基数:0、1、2、3、4、5、6、7

进位:逢8进1

位权:例如:67 = 48 + 7

4、十六进制

基数:0~ 9、a(A)~f(F) — a(A)(10) , b(B)(11), c©(12), d(D)(13), e(E)(14), f(F)(15)

进位:逢16进1

位权:例如:ff= 255

程序中怎么表示不同进制的数

写法说明打印
num = 110直接写的数字就是10进制直接打印其他进制数会显示十进制
num = 0o1100o+八s进制数oct(num),返回八进制字符串
num = 0b1100b+二进制数bin(num),返回二进制字符串
num = 0x1100x+十六 进制数hex(num),返回十六进制字符串

二、二进制

计算机存储的时候只能存储数字数据,而且存的是数字的补码。计算机对数据进行运算的时候是使用补码进行运算的,将数据从计算机中读出来看到的是原码。

1.原码

符号位+真值

说明:

符号位:最高位是0表示正数,是1表示复数

真值:去掉正负,数字对应的二进制

100的原码:01100100

-100的原码:11100100

2.反码

正数的反码:就是原码

负数的反码:原码的符号位不变,其余的位数取反。

100的反码:01100100

-100的反码:10011011

3.补码

正数的补码:还是原码

负数的补码:反码+1

100的补码:01100100

-100的补码:10011100

为什么要存补码:
因为计算机中只有加法器,没有减法器。如果计算机两个数相减,计算机内部是加上一个负数。

三、位运算

符号说明如果a=0b1010,b=0b1100
&按位与运算a & b,结果为0b1000
|按位或运算a | b,结果为0b1110
~按位取反~b,结果为-0b1101
^按位异或a ^ b,结果为0b110
<<左移a<<1,结果为0b10100
>>右移a>>1,结果为0b101

与运算:一个位上的数如果和1与,可以保留这个位上的数;和0与可以置0。

应用:判断一个是逇奇偶性。

num % 2 == 0 # num是偶数
# 如果是偶数这个数的二进制的最低位为0,为1是奇数
num & 1 == 0 # num是偶数
num & 1 == 1 # num是奇数

左移N为相当于数字*2的N次方

右移N位相当于数字//2的N次方

应用:快速乘2,整除2操作。

四、type() 和 isinstance()

共同点:两者都可以判断对象类型
不同点:对于一个 class 类的子类对象类型判断,type就不行了,而 isinstance 可以。推荐使用 isinstance 判断对象类型。

isinstance(3, int)  # True
print(isinstance([1, 3], list)) # True
### Python 中的进制位运算操作及用法 #### 1. 按位与 (`&`) 按位与操作会逐位比较两个整数的二进制表示形式。只有当两个对应的二进制位均为 `1` 时,结果才为 `1`,否则为 `0`[^2]。 ```python a = 6 # 二进制: 0110 b = 3 # 二进制: 0011 result = a & b # 结果: 0010 -> 十进制 2 print(result) # 输出: 2 ``` --- #### 2. 按位或 (`|`) 按位或操作同样逐位比较两个整数的二进制表示形式。只要其中一个对应位置上的二进制位为 `1`,则结果就为 `1`,否则为 `0`。 ```python a = 6 # 二进制: 0110 b = 3 # 二进制: 0011 result = a | b # 结果: 0111 -> 十进制 7 print(result) # 输出: 7 ``` --- #### 3. 按位异或 (`^`) 按位异或操作会对两个整数的二进制表示形式中的每一位进行对比。如果两位不同,则结果为 `1`;如果相同,则结果为 `0`[^4]。 ```python a = 6 # 二进制: 0110 b = 3 # 二进制: 0011 result = a ^ b # 结果: 0101 -> 十进制 5 print(result) # 输出: 5 ``` --- #### 4. 按位取反 (`~`) 按位取反操作会将每一个二进制位翻转:`1` 转变为 `0`,而 `0` 则转变为 `1`。需要注意的是,在 Python 中,由于负数采用补码存储方式,因此结果可能是一个负数。 ```python a = 6 # 二进制: 0110 result = ~a # 补码转换后的十进制值为 -7 print(result) # 输出: -7 ``` --- #### 5. 左移 (`<<`) 左移操作会使指定数量的比特位向左移动,左侧溢出的部分会被舍弃,右侧空缺的位置填充零[^3]。 ```python a = 6 # 二进制: 0110 result = a << 1 # 向左移动一位,结果为 1100 -> 十进制 12 print(result) # 输出: 12 ``` --- #### 6. 右移 (`>>`) 右移操作会使指定数量的比特位向右移动,右侧被移除的比特位将会丢失,对于无符号数据类型来说,左侧填入零;而对于有符号的数据类型而言,取决于具体实现(通常情况下也是填入零)[^1]。 ```python a = 6 # 二进制: 0110 result = a >> 1 # 向右移动一位,结果为 0011 -> 十进制 3 print(result) # 输出: 3 ``` --- #### 综合应用实例 以下代码展示了如何利用上述各种位运算来解决实际问题——生成格雷码序列: ```python class Solution: def grayCode(self, n: int) -> list[int]: result = [] for i in range(2 ** n): # Gray Code 的计算公式:i ^ (i >> 1) result.append(i ^ (i >> 1)) return result ``` 此函数通过循环遍历从 `0` 至 `2^n-1` 的所有数字,并依据公式 `i ^ (i >> 1)` 来构建每一步的格雷编码。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值