2016-08-22 7 views
-4
res = 1; 
for (i = 1; i <= n; i <<= 1) // n = exponent 
{ 
    if (n & i) 
     res *= a; // a = base 
    a *= a; 
} 

これは、より効率的なコードでなければなりません。なぜこれが機能するのかわかりません。このタイプのパワー機能はなぜ機能するのですか?

for()の最初の行は問題ありませんなぜ私が知っているのですか< < = i。しかし、私はどこに行があるのか​​分からない:if(n & i)。私はその仕組みが分かっていますが、私は理由を知らないのです。

+4

? –

+1

ループの 'printf'を追加して変数の値を確認しようとしましたか? http://ideone.com/NJtt4i – mch

+0

ありがとうございました –

答えて

0

符号なしの数値のバイナリ表現があるとしましょう。どのようにして小数点表記を見つけますか?

私たちは、単純な4ビットの例を見てみましょう:

N = | 0  | 1 | 0 | 1 | 
    ----------------------------------------- 
    | 2^3 = 8 | 2^2 = 4 | 2^1 = 2 | 2^0 = 1 | 
    ----------------------------------------- 
    | 0 |  4 | 0 |  1 | N = 4 + 1 = 5 

今ベースはビット毎に2に固定ではなく、前のビットの正方形で、あなたが貢献を掛けていなかった場合はどうなるのか代わりに、追加の各ビットから:あなたが見ることができるように

N = | 0 | 1 | 0 | 1 | 
    ---------------------------- 
    | a^8 | a^4 | a^2 | a^1 | 
    ---------------------------- 
    | 0 | a^4 | 0 | a^1 | N = a^4 * a^1 = a^(4+1) = a^5 

は、コードが計算^ N 'A`は何である

+0

ありがとうございました。 –

関連する問題