zoukankan      html  css  js  c++  java
  • 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程序员面试宝典》。

  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/guyuyun/p/14125624.html
Copyright © 2011-2022 走看看