之前驮樊,看到一個(gè)判斷一個(gè)正數(shù)是否是2的乘方(比如16是2的4次方)。要求性能盡可能高片酝。
思路一:從int temp = 1
開始囚衔,每次循環(huán)比較是否與number
相等,不相等就讓temp
增大一倍(temp = temp*2
)雕沿,如此循環(huán)比較练湿,直到相等為止。
這個(gè)方法的時(shí)間復(fù)雜度是O(LogN)晦炊。
思路二:尋找是2的乘方的數(shù)鞠鲜,的規(guī)律。
N N-1
2 -> 10b 1b
4 -> 100b 11b
8 -> 1000b 111b
16 -> 10000b 1111b
最高位都是1
断国。
所以贤姆,N&(N-1) = 0。時(shí)間復(fù)雜度為O(1)稳衬。
那么霞捡,求一個(gè)正整數(shù)轉(zhuǎn)成二進(jìn)制后,有多少個(gè)1薄疚?
當(dāng)然碧信,也應(yīng)該與位運(yùn)算有關(guān)了。
一個(gè)數(shù)N街夭,N&1 要么是0砰碴,要么是1。
所以板丽,結(jié)果為1時(shí)呈枉,說(shuō)明最低位是1。為0時(shí)埃碱,說(shuō)明最低位不是1猖辫。
因此,每次&后砚殿,都右移一位啃憎,再次&,直到N右移為0時(shí)似炎,結(jié)束循環(huán)辛萍。
NSInteger value = 111;
NSInteger count = 0;
while (value) {
NSLog(@"%ld",value&1);
int x = value&1;
if (x == 1) count++;
value = value>>1;
}