0x00 先来看那个
之前,看到一个这样的题:
判断一个正数是否是 2 的乘方(比如16是2的4次方)。要求性能尽可能高。
思路一:
从 int temp = 1开始,每次循环比较是否与 number 相等,不相等就让 temp 增大一倍(temp = temp*2),如此循环比较,直到相等为止。
这个方法的时间复杂度是 O(LogN)。
思路二:
寻找是 2 的乘方的数的规律。
N N-1
2 -> 10b 1b
4 -> 100b 11b
8 -> 1000b 111b
16 -> 10000b 1111b
最高位都是 1
所以,N&(N-1) = 0,时间复杂度为 O(1)。
0x01 再来看这个
那么,求一个正整数转成二进制后,有多少个1?
当然,也应该与位运算有关了。
一个数N,N&1 要么是0,要么是1。
所以,结果为1时,说明最低位是1。为0时,说明最低位不是1。
因此,每次&后,都右移一位,再次&,直到N右移为0时,结束循环。
NSInteger value = 111;
NSInteger count = 0;
while (value) {
NSLog(@"%ld",value&1);
int x = value&1;
if (x == 1) count++;
value = value>>1;
}
0x02 我的小作品
欢迎体验我的作品之一:小编辑器-XCompiler
在线编辑器,包含多种语言
App Store 搜索即可~