今天学习了位运算,做笔记加强一下记忆。
在集合论中,有交集、并集等等概念,集合是可以使用二进制来表示的,比如:当二进制中第 i 个元素为1时则表示数字 i 存在在集合中,反之若为0则表示不存在在集合中。集合{0,1,3}就可以使用二进制1010来表示,同样,二进制1010也可以用来表示集合{0,1,3},同时我们知道二进制可以转化为一个十进制数字,所以我们就可以把一个集合“ 压缩 ”为一个数字。
所以上面的1010就对应数字
一、集合与集合
(1)交集
集合:
含义:同时属于集合A和集合B的对象
位运算:a&b
位运算示例:1101
&0111
=0101
(2)并集
集合:
含义:属于集合A或集合B的对象
位运算:a|b
位运算示例:1101
|0111
=1111
(3)对称差
集合:
含义:属于A或B但不属于它们的交集的对象
位运算:a^b
位运算示例:1101
^0111
=1010
二、置位(置1)
含义:就是将数据的某些位设为1
相关的Python内置函数:int.bit_count
int.bit_count()
是 Python 中的一个内置函数,用于返回一个整数的二进制表示中置位(即为1)的个数。它的语法如下:
int.bit_count(x)
eg:
x = 10
count = int.bit_count(x)
print(count)
输出:
2
因为10的二进制表示为1010,其中1的个数为2
[Leetcode例题]
这道题看了灵神的做法,感觉又学到了新东西~
从集合的角度理解,每次操作相当于去掉集合 n 中的一个元素。
要能把 n 变成 k,k 必须是 n 的子集。如果不是,返回 −1。
如果 k 是 n 的子集,答案为从 n 中去掉 k 后的集合大小,即 n^k 的二进制中的 1 的个数。
我们这里就写第一种写法:如果 n 和 k 的交集是 k,那么 k 就是 n 的子集。
代码:
class Solution:
def minChanges(self, n: int, k: int) -> int:
if n & k!=k:
return -1
else:
return int.bit_count(n^k)