美文网首页
【总结】位运算常见技巧

【总结】位运算常见技巧

作者: 砥砺前行的人 | 来源:发表于2021-10-12 18:02 被阅读0次

原文地址:https://juejin.cn/post/6844903645171941384

判断数的奇偶性

根据数的二进制表示可知,除了最低位的 0 或者 1,其余位都是 0*2^n 或者 1*2^n,必为偶数,偶数 + 偶数 = 偶数,所以决定一个数是否为偶数的关键条件就是二进制最低位是 0 还是 1,如果是 0,则为偶数,否则为奇数(偶数 + 奇数 = 奇数)。此时问题被转化为判断数的二进制表示中,判断最低位是 0 还是 1,这时通过按位与 0x1,过滤掉除去最低位的其他位信息,输出的结果与 0 比较即可判断奇偶性

def is_odd(num):
     # 常见写法
     # return num % 2 != 0
     
    # 使用位运算
    # 根据数的二进制表示可知,除了最低位的 0 或者 1,其余位都是 0\*2^n 或者 1\*2^n,必为偶数,偶数 + 偶数 = 偶数,所以决定一个数是否为偶数的关键条件就是二进制最低位是 0 还是 1,如果是 0,则为偶数,否则为奇数(偶数 + 奇数 = 奇数)。此时问题被转化为判断数的二进制表示中,判断最低位是 0 还是 1,这时通过按位与 0x1,过滤掉除去最低位的其他位信息,输出的结果与 0 比较即可判断奇偶性。
    return num & 1 != 0

判断数是否为 2 的整数次幂

根据数的二进制与十进制的转化规则可知,每一位 bit 乘以 2 的幂次位数和即为十进制表达式,如果一个数为 2 的整数次幂,则此数的二进制中,只能由一位是1,其余位都为0(如果有多个1,则幂次不为整数),所以问题进一步转化为判断一个数的二进制表示中,是否只有一位是 1。这里还需要利用一个性质,即 x & (x - 1) == 0 的充要条件是 x 二进制表达式中只有1个位1,例如 0x00100 & 0x00011 = 00x00101 & 0x00100 != 0

def is_log2(num):
    # 使用位运算
    # 根据数的二进制与十进制的转化规则可知,每一位 bit 乘以 2 的幂次位数和即为十进制表达式,如果一个数为 2 的整数次幂,则此数的二进制中,只能由一位是1,其余位都为0(如果有多个1,则幂次不为整数),所以问题进一步转化为判断一个数的二进制表示中,是否只有一位是 1。这里还需要利用一个性质,即 x & (x - 1)  == 0 的充要条件是 x 二进制表达式中只有1个1,例如 0x00100 & 0x00011 = 0,0x00101 & 0x00100 != 0
    return num & (num - 1) == 0

判断数二进制表达中位1的个数

考虑前一个问题:“判断数是否为 2 的整数次幂”,是否可以理解为:“判断数二进制表达中位1的个数是否为1个”,解决方法是通过 num & (num - 1) == 0。那么如何确认二进制表达中是否拥有两个位1呢,我们观察:0x00101 & 0x00100 = 0x00100,再进行一次 0x00100 & 0x00011 = 0,我们发现只需要将 num & (num - 1) 进行两次,最后等于0即可。解决也是如此,每进行一次 num & (num - 1),都会让最低的那个位1被消除。只需要循环进行操作,记录下次数即可

def cn_1(num):
    # 使用位运算
    count = 0
    while num != 0:
        num = num & (num - 1)
        count += 1
    return count

找出一个数仅出现一次其他数出现两次的数组中的那个数

使用位运算进行处理的前提需要了解并运用一下的异或结论:

任何整数 n 与 0 异或总等于其本身 n,一个数与其本身异或那么结果肯定是 0。即 A ^ A = 0A ^ 0 = A

同时需要知道,异或满足交换律和结合律:A ^ C ^ A ^ C ^ B == (A^A) ^ (C^C) ^ B

综上:A ^ C ^ A ^ C ^ B = (A^A) ^ (C^C) ^ B = 0 ^ 0 ^ B = B

此题只需要依次对数组的数进行异或,相同的数异或为0,最后的结果则为只出现过一次的值

def find_one(arr):
    # 使用位运算
    e0 = 0
    for item in arr:
        e0 = e0 ^ item
    return e0

相关文章

  • 【总结】位运算常见技巧

    原文地址:https://juejin.cn/post/6844903645171941384[https://j...

  • 位运算常见技巧

    在新浪微博上看到一篇文章写位运算的写的很深入,文章链接见末尾,特此mark。 0.位运算的种类 markdown中...

  • 常见位运算及技巧

    移位运算 移位运算包含逻辑移位(logical shif) 和 算术移位(arithmetic shift)。 逻...

  • 位运算技巧

    位运算技巧的总结 1. 位运算基础 与(&)两个比特位同时为1结果为1,否则为0 或(|)只要有一个为1结果就为1...

  • 位运算技巧

    消除x最后一位1:x & (x - 1)Go代码: 一、用O(1) 时间检测整数 n 是否是 2 的幂次。分析:如...

  • 位运算技巧

    基础知识 对于位运算,大家都很熟悉,基本的位操作有与(&)、或(|)、非(~)、异或(^)等等。在面试中经常会出现...

  • 按位与运算获取图像重要的部分---OpenCV-Python开发

    常见的按位逻辑运算 在OpenCV内,常见的按位运算函数如下表所示: 函数名含义bitwise_and()按位与b...

  • 常用的位运算使用技巧总结

    一些常见的二进制位的变换操作: 注: shr--右移;shl--左移;xor--异或;or--或运算;and--与运算

  • 位运算总结

    一、数据类型的位数 二、位运算符 三、常用计算 判断int型变量a是奇数还是偶数 求平均值 对于一个大于0的整数,...

  • Python基础之位运算符(含原码反码补码的通俗解释)

    目录 1 二进制 2 原码、反码、补码 3 位运算符 4 位运算符使用技巧 上回学习运算符时,漏了位运算符,因为位...

网友评论

      本文标题:【总结】位运算常见技巧

      本文链接:https://www.haomeiwen.com/subject/amedoltx.html