| 符号 |
描述 |
运算规则 |
| & |
与 |
两个位都为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的与 或 异或 运算