当前位置: 代码迷 >> 综合 >> python 异或的应用
  详细解决方案

python 异或的应用

热度:24   发布时间:2024-02-21 13:35:09.0

符号

 描述

 运算规则                        

&      

 与

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

|  

 或    

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

^    

异或

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

~   

取反

0变1,1变0

<< 

左移

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

>> 

右移

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

公式举例:

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

作用:

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

for i  in range(100):  #打印所有奇数if i&1==1:  # 奇数 二进制 最低位 为1print(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 题目:

剑指 Offer 56 - I. 数组中数字出现的次数

一个整型数组 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 = 0a^0 = a # 0 和谁异或就是谁a^b^c = a^c^ba&(-a)= 从右到左 出现第一个1 和 右边的0 组成的 数; flag = (-a)&(a); """sum = 0i = 0for item in nums:sum = sum^item# print(sum)flag = (-sum)&(sum)  # 从右到左 出现第一个1 和 右边的0 组成的 数;# 分两组进行异或a = 0 b = 0for item in nums:if flag & item == 0:  # &与:  不太理解 a = a^itemelse:b = b^itemreturn [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] + 1else:nums_itr[item] = 1a = []for k, v in nums_itr.items():if v == 1:a.append(k)return a

 

参考: python的与 或 异或 运算

  相关解决方案