Python基础入门之位运算符

位运算符是将数字转换成二进制的形式,然后进行计算。

例如:a = 60,b = 13,

a & b = 12,这是因为a、b转换成二进制为

a = 0011 1100,

b = 0000 1101,

a & b = 0000 1100 = 12,

位运算符包含以下几种:

位运算符 含义

实例:a = 60 = 0011 1100,

           b = 13 = 0000 1101

& 与:参与运算的两个值,如果两个对应位都为1,则该位的结果为1,否则为0 a & b = 0000 1100 = 12
| 或:参与运算的两个值,如果两个对应位有一个为1,则该位的结果为1,否则为0 a | b = 0011 1101 = 61
^ 异或:参与运算的两个值,如果两个对应位不一致,则该位的结果为1,否则为0 a ^ b = 0011 0001 = 49
~ 取反:对参与运算的这个值的每个位都取相反数,即1变为0,0变为1,~x 相当于 -x-1 ~a = 1100 0011 = -61,有符号位的补码(稍后说明二进制的负数表示方式)
<< 左移动:对参与运算的这个值的每个位都左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0 a << 2 = 1111 0000 = 240
>> 右移动:对参与运算的这个值的每个位都右移若干位,由“<<”右边的数指定移动的位数,低位丢弃,高位补0 a >> 2 = 0000 1111 = 15

了解了位运算符的含义,现在开始做道练习题。

例题一:输入非空的两个二进制字符串,只包含0和1,返回两个数的和(1、用二进制表示结果;2、输入的值除‘0’外,都为非‘0’开始的二进制)

解析:我们可以设计这样的算法来计算:

把 a 和 b 转换成整型数字 c 和 d,在接下来的过程中,c 保存结果,d 保存进位。

当进位不为 0 时:

1、计算当前 c 和 d 的无进位相加结果:result = c ^ d;

2、计算当前 c 和 d 的进位:jin = (c & d) << 1;

3、完成本次循环,更新 c = result,d = jin;

当进位为0时,返回 c 的二进制形式;

为什么这个方法是可行的呢?在第一轮计算中,result 的最后一位是 c 和 d 相加之后的结果,jin 的倒数第二位是 c 和 d 最后一位相加的进位。接着每一轮中,由于 jin 是由 c 和 d “按位与”并且“左移”得到的,那么最后会补零,所以在下面计算的过程中后面的数位不受影响,而每一轮都可以得到一个低 i 位的答案和它向低 i+1 位的进位,也就模拟了加法的过程。

代码如下:

def addBinary(self, a: str, b: str) -> str:
        c = int(a, 2)
        d = int(b, 2)
        while d:
            result = c ^ d
            jin = (c & d) << 1
            c = result
            d = jin
        return bin(c)[2:] # bin() 返回一个整数 int 或者长整数 long int 的二进制表示。

以上就是关于位运算符的简单介绍,之后会记录一下,二进制的负数的表示和如何更好的理解,谢谢。

转载请注明出处,万分感谢!

猜你喜欢

转载自blog.csdn.net/hbblzjy/article/details/121802791
今日推荐