若是讓你求解 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; }