2016-03-29 12 views
0

私は最近、指数を計算できる単純な電卓をC++で作ったが、2^31までしか動かない。ここで が問題であり、私の入力/出力は次のとおりです。(C++)2^32 = 0しかし2^31 * 2の仕事

基本的に
I: 2^31 
O: 131072 

I: 2^32 
O: 0 

I: 13107*2 
O: 262144 

それが2^32を行うことはできませんが、それは(2^31)を行うことができます* 2、私はちょうどその理由を理解することはできません。もし誰かが私を助けて、なぜ私が本当にそれを感謝するのか説明することができます。指数を計算するコードは次のとおりです。

long exp(long x, int y) { 
    int p; 

    if (y % 2 == 0) { 
     p = 1; 
    } 
    else { 
     p = x; 
    } 

    while (y > 1) { 
     x *= x; 
     y /= 2; 
    } 
    return x*p; 
} 
+5

2^31の回答は間違っています。 – user2357112

+3

私のC++のスキルには、パワーオペレータはありません。 http://stackoverflow.com/questions/4843304/why-is-my-power-operator-not-working –

+0

かなりクール、右ですか?キーは、コンピュータ上の数字の表現を理解することにあります。この動作はデフォルトでは有限であり、常に表すことのできない数値が存在します。任意の大きな数値を使用するのに役立つライブラリがありますが、通常はほとんどの言語でデフォルトの動作ではありません。確かにC++のために決してない。 –

答えて

0

に「長い」回すことにより "長い間 "私は2^32を表すことができました。

の人が2^31だっ指摘もう一つの問題は、私は2で割るとき、それは後で奇数になることができさえたとえY開始という事実を考慮していないので、つまり、間違っている、とあなたが2で再びダイビングするとき、それは必要以上に1サイクル少ない時間を行います。

EX:= 1、Y = 6 >> 6/2 = 3 >> 3/2

EDIT:いずれかがここに興味を持っている場合、私は、それを修正するために管理方法をコードルックスです今すぐ:

long long exp(long long x, int y) { 
    int p = 1; 


    while (y > 1) { 
     if (y % 2 != 0) { 
      p *= x; 
     } 
     x *= x; 
     y /= 2; 
    } 
    return x*p; 
} 

私が見たことからは、動作しているようです。

3

小さな数字であっても関数が間違っています。 考えてみましょう:

long long exp(long long x, int y) 
{ 
    long long result = x; 
    while(--y) 
    { 
     result*=x; 
    } 
    return result; 

} 

EDIT:それが唯一の正の数のために働く注意

std::cout << exp(2,4); // 16 
std::cout << exp(2,5); // 32 
std::cout << exp(2,6); // 16 ??? 

まず、あなたは、第二の大きな数字を表現することが可能である大きいタイプを使用して、関数の実装を修正する必要があります。 C++にはビルトインの「パワー演算子」はありません。 Operator ^はXOR演算子と呼ばれ、2つの数値に対してビット単位の演算を実行します。 注:ビットのペアの一方のみが設定されている場合、XOR演算の結果のすべての単一ビットは、1に設定されている

int x = 0b101'111; //47 
int y = 0b110'010; //50 
//x^y = 0b011'101 
std::cout << (x^y); //outputs 29 

、そうでなければ0

x:  0 1 0 1 
y:  0 0 1 1 

result: 0 1 1 0 
+1

'^'演算子が実際に何をしているのかを説明する行を追加するか、少なくともC++演算子のドキュメントに読者を指し示すような行を追加するだけです。 – user4581301

+0

あなたの実装は正しいかもしれませんが(私は試していませんが、控えめな累乗アルゴリズムのように見えます)、OPは明らかに基数を2乗し指数を半分にする累乗指数アルゴリズムになります。彼のそれの実装は確かに間違っていた。 –

+0

2 * 2 * 2 * 2 = 4 * 4 * 2 = 8 * 2 = 16 2 * 2 * 2 * 2の代わりに、 2 * 2 = 4 * 2 * 2 * 2 = 8 * 2 * 2 =しかし、ありがとう。 –

関連する問題