1

私は立ち往生しており、何時間も自分のコードを見てきましたが、何が問題なのかわかりません。私の関数が行うことは、負数または正数のいずれかを受け取り、それを 32 ビットの 2 の補数の 16 進数表現に変換することです。私の関数は、文字の配列 (32 ビットの符号付きマグニチュード表現) を受け取り、配列の 2 の補数を取ります。それを2の補数に変換する私のアプローチは、特定の文字が見られたときに文字を配列に割り当てるだけです。配列内の文字が最初の文字である場合は、特殊なケースが発生します。残りは通常否定されます。私は現在立ち往生しています。値 -23 (符号付きマグニチュードは 80000017) を入力すると、値 K00000KK が得られます。-23452 (符号付きマグニチュード 80005B9C) --> K000KKKK. 値を「K」に設定しました コードがスタックしている場所を見つけるために、元の値は「7」でした。コードには、コンパイラがどこに向かっているのかを確認するための表示メッセージを入れています。

for -23 (80000017) input I get the messages

first 1 is seen, leave first 1 the same
first 1 is seen, leave first 1 the same
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
first 1 is seen, leave first 1 the same

ほとんどの場合、K が表示される場所は最初の 1 メッセージを取得する場所であり、0 が表示される場所は --> 0 メッセージを取得する場所です

ご協力ありがとうございました!とても有難い!

コードのフォーマットが私を悩ませたので、これは私のコードへのペーストビンリンクです...

http://pastebin.com/KSeymwcs

char* two_complement(int number, char* sign_mag_array){

int first_one_flag = 0;

if(number > 0){
    cout << "positive number" << endl;
    return sign_mag_array;
}

if(number < 0){
    for(int q = 7; q >= 0; q--){
        if(first_one_flag == 1){                // negate the rest regularly
            cout << "negate normally " << endl;

            if(sign_mag_array[q] == '0'){
                sign_mag_array[q] = 'F';
            }
            if(sign_mag_array[q] == '1'){
                sign_mag_array[q] = 'E';
            }
            if(sign_mag_array[q] == '2'){
                sign_mag_array[q] = 'D';
            }
            if(sign_mag_array[q] == '3'){
                sign_mag_array[q] = 'C';
            }
            if(sign_mag_array[q] == '4'){
                sign_mag_array[q] = 'D';
            }   
            if(sign_mag_array[q] == '5'){
                sign_mag_array[q] = 'A';
            }
            if(sign_mag_array[q] = '6'){
                sign_mag_array[q] = '9';
            }
            if(sign_mag_array[q] == '7'){
                sign_mag_array[q] = '8';
            }
            if(sign_mag_array[q] == '8'){
                sign_mag_array[q] = '7';
            }
            if(sign_mag_array[q] = '9'){
                sign_mag_array[q] = '6';
            }   
            if(sign_mag_array[q] == 'A'){
                sign_mag_array[q] = '5';
            }   
            if(sign_mag_array[q] == 'B'){
                sign_mag_array[q] = '4';
            }
            if(sign_mag_array[q] = 'C'){
                sign_mag_array[q] = '3';
            }
            if(sign_mag_array[q] == 'D'){
                sign_mag_array[q] = '2';
            }
            if(sign_mag_array[q] == 'E'){
                sign_mag_array[q] = '1';
            }
            if(sign_mag_array[q] == 'F'){
                sign_mag_array[q] = '0';
            }
        }


        if(sign_mag_array[q] == '0' && first_one_flag == 0){
            cout << "no one's showed up yet --> 0 " << endl;
        }
        else{                                               // first '1' in binary seen. special negating
            //first_one_flag = 1;               
            cout << "first 1 is seen, leave first 1 the same " << endl;

            if(sign_mag_array[q] == '1'){
                sign_mag_array[q] = 'F';        
            }
            if(sign_mag_array[q] == '2'){
                sign_mag_array[q] = 'E';
            }
            if(sign_mag_array[q] == '3'){
                sign_mag_array[q] = 'D';
            }
            if(sign_mag_array[q] == '4'){
                sign_mag_array[q] = 'C';
            }
            if(sign_mag_array[q] == '5'){
                sign_mag_array[q] = 'B';
            }
            if(sign_mag_array[q] == '6'){
                sign_mag_array[q] = 'A';
            }
            if(sign_mag_array[q] = '7'){
                sign_mag_array[q] = '9';
            }
            if(sign_mag_array[q] == '8'){
                sign_mag_array[q] = '8';
            }
            if(sign_mag_array[q] == '9'){
                sign_mag_array[q] = 'K';
            }       
            if(sign_mag_array[q] == 'A'){
                sign_mag_array[q] = '6';
            }   
            if(sign_mag_array[q] == 'B'){
                sign_mag_array[q] = '5';
            }
            if(sign_mag_array[q] == 'C'){
                sign_mag_array[q] = '4';
            }
            if(sign_mag_array[q] == 'D'){
                sign_mag_array[q] = '3';
            }
            if(sign_mag_array[q] == 'E'){
                sign_mag_array[q] = '2';
            }
            if(sign_mag_array[q] == 'F'){
                sign_mag_array[q] = '1';
            }
        }
    }    
}
return sign_mag_array;

}

4

2 に答える 2

4

エラーは単純です

        if(sign_mag_array[q] = '7'){
            sign_mag_array[q] = '9';
        }

する必要があります

        if(sign_mag_array[q] == '7'){
            sign_mag_array[q] = '9';
        }

        if(sign_mag_array[q] = 'C'){
            sign_mag_array[q] = '3';
        }

する必要があります

        if(sign_mag_array[q] == 'C'){
            sign_mag_array[q] = '3';
        }

        if(sign_mag_array[q] = '9'){
            sign_mag_array[q] = '6';
        }   

する必要があります

        if(sign_mag_array[q] == '9'){
            sign_mag_array[q] = '6';
        }   

etc. etc. お分かりだと思いますが、

このように繰り返しが多いコードはスタイルが悪く、このようなエラーが発生しやすくなります。少し数学を使えば、このコードを大幅に単純化して短縮できるはずです。

たとえば、16 進数を整数に、またはその逆に変換する 2 つの関数を追加します。

int hex_to_int(char x)
{
   return x <= '9' ? x - '0' : 10 + (x - 'A');
}

char int_to_hex(int x)
{
   return x < 10 ? '0' + x : 'A' + (x - 10);
}

そして今、このようなコード

       if(sign_mag_array[q] == '0'){
            sign_mag_array[q] = 'F';
        }
        if(sign_mag_array[q] == '1'){
            sign_mag_array[q] = 'E';
        }
        ...
        if(sign_mag_array[q] == 'E'){
            sign_mag_array[q] = '1';
        }
        if(sign_mag_array[q] == 'F'){
            sign_mag_array[q] = '0';
        }

になる

     if (sign_mag_array[q] >= '0' && sign_mag_array[q] <= '9' || 
         sign_mag_array[q] >= 'A' && sign_mag_array[q] <= 'F')
     {
         int digit = hex_to_int(sign_mag_array[q]);
         sign_mag_array[q] = int_to_hex(15 - digit);
     }

これは、48 行の繰り返しコードが非常に少なくなったことです。おまけとして、ゼータが見つけた問題も修正します。

于 2013-04-16T06:08:29.780 に答える
2

ジョンが言ったことに加えて、あなたの論理は現在間違っています。次のスニペットを見てください。

    if(sign_mag_array[q] == '1'){
        sign_mag_array[q] = 'F';        
    }
    /* ... */
    if(sign_mag_array[q] == 'F'){
        sign_mag_array[q] = '1';
    }

の場合sign_mag_array[q]'1'に設定し'F'ます。これにより、後の条件が真になり、sign_mag_array[q]にリセットされ'1'ます。

排他的な条件が必要です:

    if(sign_mag_array[q] == '1'){
        sign_mag_array[q] = 'F';        
    }
    else if(sign_mag_array[q] == '2'){
        sign_mag_array[q] = 'E';        
    }
    /* ... */
    else if(sign_mag_array[q] == 'F'){
        sign_mag_array[q] = '1';
    }

switchそして、すでに排他的になっているので、長い一連の ifs の代わりに単純に a を使用できます。

switch(sign_mag_array[q]){
    case 'F': sign_mag_array[q] = '1'; break;
    case 'E': sign_mag_array[q] = '2'; break;
    /* ... */
    case '1': sign_mag_array[q] = 'F'; break;
}
于 2013-04-16T06:19:55.303 に答える