• Python刷题:常用二进制操作(位运算)


    1. 变量值互换

    题目描述:在不使用第三个变量的前提下使用二进制的方式互换两个整型变量的值。
    解题代码:

    >>> a = 1234
    >>> b = 5678
    >>> a = a ^ b
    >>> b = a ^ b
    >>> a = a ^ b
    >>> print(a, b)
    5678 1234
    

    总结:互换两个变量的值其实在Python中也可以很简单,比如a, b = b, a,但是,如果要使用二进制的方式来进行操作的话,可以利用“异或”操作的特性,从这个算法也可以得到“异或”操作这样一个特性:两个整型值“异或”可以得到一个中间值,这个中间值和原先的任何一个值再次进行“异或”操作就可以得到另一个变量的值。

    2. 最低位的1清零

    题目描述:对于一个整型值,在二进制表示中,将其最低位的1变为0,其他位置的值不变。
    解题代码:

    >>> x = 124
    >>> bin(x)
    '0b1111100'
    >>> bin(x&(x-1))
    '0b1111000'
    

    总结:这也是一个常用的二进制操作,使用公式x&(x-1)即可,&为二进制的“与”操作。

    3. 获取最低位的1

    题目描述:对于一个整型值,在二进制表示中,只保留最低位的1,其余位置的值全部变为0。
    解题代码:

    >>> x = 86
    >>> bin(x)
    '0b1010110'
    >>> bin(x&~(x-1))
    '0b10'
    

    总结:这也是一个常用的二进制操作,使用公式x&~(x-1)即可,$为二进制的“与”操作,~为二进制的“取反”操作。

    4. 交换指定位置的两个比特位

    题目描述:对于一个整型值,在二进制表示中,交换指定位置的两个比特位的值。
    解题代码:

    def swap_bit(x, i, j):
        # 如果第i位和第j位是相同的,则没必要交换
        if ((x >> i) & 1) != ((x >> j) & 1):
            x ^= ((1 << i) | (1 << j))
    
        return x
    
    
    x = 0b0101
    i = 0
    j = 1
    print(bin(swap_bit(x, i, j)))  # 输出:0b110
    

    总结:这也是一个常用的二进制操作,使用公式x ^= ((1<<i) | (1<<j))即可,^为二进制的“异或操作”。

    题目及解题算法来自:书籍《Python程序员面试宝典》。

  • 相关阅读:
    css div position to parent
    linux 解压缩/压缩命令大全
    button with backgroundimage programmaticaly
    使用数组初始化vector 对象
    AudioServicesPlaySystemSound
    objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
    指针和多维数组(例子需要好好消化理解)
    很经典的赋值算法之一:动态为数组有序赋值
    string 类的c_str 的成员函数
    自由存储区的空间 C++和C
  • 原文地址:https://www.cnblogs.com/guyuyun/p/14125624.html
Copyright © 2020-2023  润新知