[蓝桥杯备赛]位运算学习笔记

今天学习了位运算,做笔记加强一下记忆。

在集合论中,有交集、并集等等概念,集合是可以使用二进制来表示的,比如:当二进制中第 i 个元素为1时则表示数字 i 存在在集合中,反之若为0则表示不存在在集合中。集合{0,1,3}就可以使用二进制1010来表示,同样,二进制1010也可以用来表示集合{0,1,3},同时我们知道二进制可以转化为一个十进制数字,所以我们就可以把一个集合“ 压缩 ”为一个数字

所以上面的1010就对应数字2^{3}*1+2^{2}*0+2^{1}*1+2^{0}*0=8+2=10

 一、集合与集合

(1)交集

集合:A\cap B

含义:同时属于集合A集合B的对象

位运算:a&b

位运算示例:1101

                    &0111

                    =0101

(2)并集

集合:A\cup B

含义:属于集合A集合B的对象

位运算:a|b

位运算示例:1101

                     |0111

                    =1111

(3)对称差

集合:A\bigtriangleup B

含义:属于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)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值