前言:
如往常一样,打开每日一练刷刷题,看到其难度为简单,于是满怀信心点开此题,题目倒是看的懂,只是看到选项中(cur += (n >> i) & 1; return n > 0 && cur == 1;)时,懵了看不懂哈哈,于是我查找资料,并复习了一下位移运算符与逻辑运算符,才看的懂选项,然后就做出来了。
题目:
正确答案:
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
bool isPowerOfTwo(int n)
{
int cur = 0;
for (int i = 0; i < 31; i++)
{
cur += (n >> i) & 1;
}
return n > 0 && cur == 1;
}
};
讲解:
想必难点大家都看出来了,分别拿出来看">>"和"&"还是看的懂的,但是一旦和数字、字母连起来了就是真的傻眼了,很少见这种类型,继续往下看,我带你解决这个两个问题。
1.">>"右移运算符
在与数字进行连接时 会自动将数字转为二进制进行操作
例:120 >> 2 其中:">>"左边的数120 称为左操作数 ">>"右边的数2 称为右操作数
">>"的含义:将左操作数向右移动其右操作数所要求的位数,移出的位补0;
公式:向右移一次,结果为该数除以2,即:将一个数向右移n位,相当于将该数除以2的n次方。
左移运算符刚好相反,想必大家这么聪明肯定都会了,我就不列举了。
如果你真的还想知道更多细节:可以看看这为博主所写:
【C语言初阶】操作符之 移位运算符(>>、<<)详解
2."&"位与运算符
在数字和数字进行连接时 会自动将数字转为二进制进行判断
例:2&1结果为0 10&15结果为 1(10 > 0转为bool类型 为真 结果为1)
解决:
两个问题既然都已经解决了,那么可以看懂选项了。例如将n = 2代入,i = 0. 2>>0 仍为 2 2&1 结果为假 返回0,cur += 0; i++, 2>>1 结果为1 二进制为 00000001 1&1 结果 二进制为00000001 为 真 返回1 cur += 1,cur = 1 ,之后 2>>2,3,4...30 二进制均为 00000000 & 1 的结果均为 0.最终cur =1,符合 2>0&&cur == 1.
总结:一些基础知识确实应该牢牢掌握才行,并不是我们不会,而是我们没有一个牢固的基础,不要小看简单的难度,其知识点我们未必掌握。