求一個(gè)正整數(shù)轉(zhuǎn)成二進(jìn)制后,有多少個(gè)1?

之前,看到一個(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í),說明最低位是1。為0時(shí),說明最低位不是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;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容