符号

 描述

 运算规则                        

&      

 与

两个位都为1时,结果才为1     (统计奇数)                      全1为1

|  

 或    

两个位都为0时,结果才为0       (统计偶数)                     全0为0

^    

异或

两个位相同为0,相异为1      (常用统计不相同数)               不同为1

~   

取反

0变1,1变0

<< 

左移

各二进位全部左移若干位,高位丢弃,低位补0

>> 

右移

各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

公式举例:

a^a = 0
        a^0 = a # 0 和谁异或就是谁
        a^b^c = a^c^b
        a&(-a)= 从右到左 出现第一个1 和 右边的0 组成的 数; 
        flag = (-a)&(a);  
        位操作:一般是将数字化为二进制数后进行操作。
        &:两个字符都为1时 结果才为1,^(异或):两个位相同为0,不同为1

作用:

1. 判断奇偶  (二进制数以1结尾是奇数,以0结尾是偶数)

for i  in range(100):  #打印所有奇数
    if i&1==1:  # 奇数 二进制 最低位 为1
        print(i)

2. 消去最后一位1

x & (x - 1)

举例: 

bin(6) = '0b110'
bin(5) = '0b101'
bin(4) = '0b100'
6&5 = 4 # 将 6的二进制 最后一位1 给消除(从左往右);

3. 找出出现一次的数

a ^ b ^ b = a

leetcode 题目:

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]

示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

方法1:  异或的方法

class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        # 异或知识点
        """
        a^a = 0
        a^0 = a # 0 和谁异或就是谁
        a^b^c = a^c^b
        a&(-a)= 从右到左 出现第一个1 和 右边的0 组成的 数; 
        flag = (-a)&(a); 
        """
        sum = 0
        i = 0
        for item in nums:
            sum = sum^item
        # print(sum)
        flag = (-sum)&(sum)  # 从右到左 出现第一个1 和 右边的0 组成的 数;
        # 分两组进行异或
        a = 0 
        b = 0
        for item in nums:  # 只有 两个 数出现 1 次, 而其他数都出现 2 次;
            if flag & item == 0:  # &与:  不太理解 
                a = a^item
            else:
                b = b^item

        return [a, b]

方法2:

class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        
        nums_itr = {}
        for item in nums:
            if item in nums_itr.keys():
                nums_itr[item] = nums_itr[item] + 1
            else:
                nums_itr[item] = 1
        a = []
        for k, v in nums_itr.items():
            if v == 1:
                a.append(k)
        return a

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

 解法1:   异或方法

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # a ^ b ^ b = a
        sum = 0
        for item in nums:  # 只有一个数出现1次, 而其他数都出现 2 次;
            sum = sum^item
        return sum

解法2:  复杂度 不太符合要求

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        dirc = {}
        for item in nums:
            if item in dirc.keys():
                dirc[item] += 1
            else:
                dirc[item] = 1

        for k, v in dirc.items():
            if v == 1:
                return k
        return False

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:

输入:nums = [3,4,3,3]
输出:4

示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

解法1:   不太理解的  大神解法

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # 使用 异或 
        # a^b^c = a^c^b
        a = 0 
        b = 0
        for item in nums:
            a = (a ^ item) & (~b)  # ????
            b = (b ^ item) & (~a)

        return a

解法2: 

class Solution:
    def singleNumber(self, nums: List[int]) -> int:

        dict_nums = {}
        for item in nums:
            if item in dict_nums.keys():
                dict_nums[item] += 1
            else:
                dict_nums[item] = 1
        for k, v in dict_nums.items():
            if v == 1:
                return k
        return False