一、前言
1.位移的定义
位移运算符 << 与 >> 是二元的位运算符;
即有两个被操作的数:x<<y——将x左移y位;x>>y——将x右移y位。
二、题目解析
190.颠倒二进制位 难度:简单
class Solution:
def reverseBites(self,n:int)->int:
res=0
for i in range(32):
res=(res<<1)|(n&1)
n=n>>1
return res
颠倒给定的32位无符号整数的二进制位,综合应用了位与、位或、左移、右移;
建立循环依次遍历,每次将res左移1位用来连接n的尾端,之后再将n右移一位;
因为每次res左移1位后,末位为0,n每次位与上1都为其本身,0或上1为1,0或上0为0。
231.2的幂 难度:简单
class Solution:
def isPowerOfTwo(self,n:int)->int:
for i in range(31):
if (1<<i)==n:
return True
return False
2的幂的题目在二进制各种运算中经常出现,也就是有很多种方法都可以解这道题目;
此次使用的是左移的方法做的;
因为1左移的执行效果本质即为2的x次幂,用if与n做比较即可。
476.数字的补数 难度:简单
class Solution:
def findComplement(self,num:int)->int:
i=ans=0
while num:
if not num&1:
ans+=1<<i
num>>=1
i+=1
return ans
一个特别巧的方法;
338.比特位计数 难度:简单
class Solution:
def countBits(self,n:int)->List[int]:
bits=[0]
for i in range(1,n+1):
bits.append(bits[i>>1]+(i&1))
return bits
此题解题思路来源于官方
三、刷题总结
今天的题目都是关于一些位运算的,但是如果是入门的话(说的就是我),刻意地使用这个方法去解题还是有一些难度的,容易会在一些方面想不明白,甚至也会想放弃,但是相信我,多花时间去想一想,想明白的那一瞬间,还是很快乐的!
最后,介绍一下自己,我是缪斯,不愿被定义!