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程序员面试宝典》。

(0)

相关推荐

  • 如何去使用Python里面的函数式编程和闭包?

    对于开发者来说除了基础语法之外,一些比较常用的开发手段也是需要去学习和使用的.这里小千就来教大家如何去使用Python里面的函数式编程和闭包. 函数式编程 函数式编程这个概念我们可能或多或少都听说过, ...

  • Python有哪些运算符?用法介绍!

    众所周知,编程语言的本质就是解决运算逻辑,包括Python也是如此,它可以通过各种算法实现想要的功能;当然,我们也必须搞懂各类运算符的使用,那么Python有哪些运算符呢?它的使用方法是什么?我们来看 ...

  • 异或运算赋值

    在二进制运算中,除了左移赋值运算和右移赋值运算外,还有与运算赋值(&=).异或运算赋值(^ =).或运算赋值(| =),下表列出了位运算符"&=.^ =.| ="的 ...

  • Python刷题:用二进制方式求集合S的所有子集(位运算)

    题目描述 有一个集合S,要求打印出其所有子集,子集元素用逗号隔开,其中集合S本身和空集NULL都认为是集合S的子集.例如,有一个集合S,它的内容为"S={"A", &qu ...

  • Python刷题:最长回文子串(字符串)

    题目描述 给定一个仅包含小写字母的字符串,求它的最长回文子串的长度.所谓回文串,指左右对称的字符串. 解题思路 当字符串不为空时,回文子串最少也是一个字符,即初始长度为1,当回文子串更长时,就可能有两 ...

  • ​LeetCode刷题实战191:位1的个数

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • 不靠刷题,没高智商,死磕一点,竟然成就了300位高考状元!

    丰田弱者相信命运和机遇,强者只信因果.-艾默生 中国诞生了上千位高考状元,他们高分的背后有着神秘的规律.掌握这些规律,孩子可以走"直线"实现名校梦想. 智商并不是决定因素 中科院曾 ...

  • 无意中发现一位大佬的算法刷题pdf笔记

    逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到. ...

  • python:os.path - 常用路径操作模块

    应该是所有程序都需要用到的路径操作,不废话,直接开始 以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取.分割.拼接.判断.获取文件属性. 1.路径获取 ...

  • Python面试必刷题系列(2)

    刷面试题是一种很好的感知职场需求.发现自身知识缺陷并不断提升自我的过程.本专题通过收集.整理Python真实面试题,给大家讲解面试过程中对Python比较常见的考察点和备考点,希望能够引起读者的足够重 ...

  • 神了!无意中发现一位大佬1500道的LeetCode算法刷题pdf笔记!

    昨晚逛GitHub,无意中看到一位大佬的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到. 关于算法刷题的困惑和疑问也经常听朋友们提及.这份笔记 ...

  • ​LeetCode刷题实战400:第 N 位数字

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...