(1)面试题:用一个表达式,判断一个数N是否是2的幂次方(2,4,6,8,...),不可以用循环语句做。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 int main(int argc, char **argv)
6 {
7 unsigned int n = atoi(argv[1]);
8
9 if (n >= 1) {
10 if (n & (n - 1))
11 printf("%d: no/n", n);
12 else
13 printf("%d: yes/n", n);
14 }
15 exit(EXIT_SUCCESS);
16 }
-----------
$ ./a.out 16
16: yes
-----------
知识点:
给定一个正整数(N <= 2^32),要求快速判断它是否为2的幂次方。(不可用循环)
通常我们知道:
十进制 二进制
2^0 == 1 0000 0001
2^1 == 2 0000 0010
2^2 == 4 0000 0100
2^3 == 8 0000 1000
2^4 == 16 0001 0000
2^5 == 32 0010 0000
从上述规律中我们可以得出,题目最终归结为判断此数的二进制表示(unsigned)中是否只有一位为1。
--(2)!(X&(X-1))