2016-04-17 9 views
0

私はCで始まっていますが、私が今やっていることは簡単な数学的操作です。私は何をしたいですか?私は指数をとり、力2を返す関数が必要です。そして私は論理的なシフト演算子を使いたい。 Wiki: Logical shiftsCの論理シフトで2のべき乗を実装する方法は?

論理シフトは、2の累乗による符号なし整数の 乗算または除算を実行する効率的な方法として有用であることができます。 符号付きまたは符号なし2進数の左にnビットシフトすると、に2nを掛けた効果があります。

しかし、私が理解できない1つのことがあります。大きい指数では正しく機能しません。たとえば、以下のコードで詳しく説明します。だから、そのような関数は、数学ライブラリを使用せずにすぐに実装できますか?前もって感謝します。

long power_of_two_ext(int exp) { 
    exp = 32; // for testing purpose only 

    long retL = pow(2, exp); 
    printf("MATH pow() and long ---> %ld\n", retL); 

    long retL2 = 1 << exp; 
    printf("Shift bits left and long ---> %ld\n", retL2); 

    long long retL3 = 1 << exp; 
    printf("Left shift and long ---> %llu\n", retL3); 
    return retL; 
} 

MATH pow() and long ---> 4294967296 
Left shift and long long ---> 1 
Left shift and long ---> 1 
+0

あなたが知っているように、左シフトビットには限界があります。 – ryantxr

答えて

2

1 << expint左シフトされます。結果をlongまたはlong longに代入しているからといって、その型で式が評価されるわけではありません。書かれているように、あなたのコードはintを使用していて、intが32ビットのマシンで動作していると思われます。 [注意:整数型の幅以上の量だけ左にシフトするための未定義の動作ですので、コードの動作が一貫しない可能性があります。

代わりに、正しいタイプの定数を使用して、式が正しいタイプであることを確認してください。

long retL2 = 1L << exp; 
... 
long long retL3 = 1LL << exp; 
関連する問題