头疼的位操作

起因于 Single Number:一个数字在数组中只出现了一次,其它数字都出现了两次,找到这个数字。

def singleNumber(nums):
    res = 0
    for i in nums:
        res ^= i
    return res

两个相同的数相与会抵消,最后只会剩下只出现一次的那个数。逻辑上感觉很好理解,但是具体我就容易懵,先暂且记录一下吧。

还有两个数字在数组中只出现了一次,其它出现了两次。
思路是这样:先将所有数字异或一遍,那么最后留下来的数字就是那两个只出现一次数字的异或。
根据这个数而应 2 进制从右边起第一个 1,将原数组拆成 2 份,然后分别异或可以得到结果。

# 大神代码
def singlenumber3(nums):
    tmp = singleNumber(nums)
    res = [0, 0]
    # 得到不同的那一位为 1
    mask = tmp &(-tmp)
    for i in nums:
        if i & mask:
            res[0] ^= i
        else:
            res[1] ^= i
    return res

这里想不明白的是 mask = tmp &(-tmp) 是如何得到其二进制最右边的 1?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,195评论 0 13
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,803评论 0 10
  • 如果现在是小说,出国交换这么大的剧情应该是有很大的作用的,会切换故事线的。 或者说这一年就是用来错过一些重要的机会...
    电风扇和电蚊香阅读 79评论 0 0
  • 模糊的月已开始有些明朗, 余晖还在空中飘荡着。 忽然间, 一群鸟成人字形飞过上空, 引得无数思绪在心头。 青空下,...
    伞曲阅读 393评论 0 2
  • 万达以严格的管理制度而著称,这已经成为万达企业文化价值的一部分,融入了万达体系内的各个角落。作为一个企业,在其发展...
    LiveFuture阅读 329评论 0 1