位運算題目

m的n次方

若是讓你求解 m 的 n 次方,而且不能使用系統自帶的 pow 函數,你會怎麼作呢?這還不簡單,連續讓 n 個 m 相乘就好了,代碼以下:函數

int pow(int n){
    int tmp = 1;
    for(int i = 1; i <= n; i++) {
        tmp = tmp * m;
    }
    return tmp;
}

若是讓你用位運算來作,你會怎麼作呢?spa

我舉個例子吧,例如 n = 13,則 n 的二進制表示爲 1101, 那麼 m 的 13 次方能夠拆解爲:code

m^1101 = m^0001 * m^0100 * m^1000。blog

咱們能夠經過 & 1和 >>1 來逐位讀取 1101,爲1時將該位表明的乘數累乘到最終結果。直接看代碼吧,反而容易理解:class

int pow(int n){
        int sum = 1;
        int tmp = m;
        while(n != 0){
            if((n & 1) == 1){
                sum *= tmp;
            }
            tmp *= tmp;
            n = n >> 1;
        }

        return sum;
    }
相關文章
相關標籤/搜索