“整数是否为2次幂的算法”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的3个中间版本) | |||
第1行: | 第1行: | ||
− | https://www.bilibili.com/video/BV1kA411u7xD | + | https://www.bilibili.com/video/BV1kA411u7xD |
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
第37行: | 第37行: | ||
| | | | ||
|1 | |1 | ||
+ | |0 | ||
+ | |…… | ||
|0 | |0 | ||
|0 | |0 | ||
第43行: | 第45行: | ||
|0 | |0 | ||
|1 | |1 | ||
+ | |省略号 | ||
|1 | |1 | ||
+ | |1 | ||
+ | |- | ||
+ | |= | ||
+ | |0 | ||
+ | |0 | ||
+ | |…… | ||
+ | |0 | ||
+ | |0 | ||
+ | |} | ||
+ | 如果是 n=1,那么就是: | ||
+ | {| class="wikitable" | ||
+ | | | ||
+ | |0 | ||
+ | |0 | ||
+ | |1 | ||
+ | |- | ||
+ | |& | ||
+ | |0 | ||
+ | |0 | ||
+ | |0 | ||
|- | |- | ||
|= | |= | ||
第50行: | 第73行: | ||
|0 | |0 | ||
|} | |} | ||
+ | 复杂度O(n) |
2022年11月6日 (日) 21:45的最新版本
https://www.bilibili.com/video/BV1kA411u7xD
int pow2(int n)
{
return (n > 0) && ((n & (n - 1)) == 0);
}
int main()
{
int a = 31;
int ret = pow2(a);
printf("ret = %d \n", ret);
return 0;
}
注意:
“==”(等于运算符)要比“&”按位与运算符优先级高,所以“n&(n-1)”要先套一层括号再进行“==0”的判断。
算法原理:
20=1 (1)2
21=2 (10)2
22=4 (100)2
23=8 (1000)2
24=16 (10000)2
……
n(任意整数)不是奇数就是偶数,和 n-1 进行按位与运算就是:
1 | 0 | …… | 0 | 0 | |
& | 0 | 1 | 省略号 | 1 | 1 |
= | 0 | 0 | …… | 0 | 0 |
如果是 n=1,那么就是:
0 | 0 | 1 | |
& | 0 | 0 | 0 |
= | 0 | 0 | 0 |
复杂度O(n)