2016-06-17 25 views
0

私のプログラムに何が間違っているかの手がかりはありません。この「実験」をプロジェクトに追加する前に、少なくともコンソールアプリケーションでこれを使用できるかどうかテストしたところ、わかりましたが、私は失敗しました。数値ベース間の変換が間違っています

数値ベース(これまではB16またはB2のみを小数点以下)に変換するライブラリを作成しました。モジュラスとディビジョンをどのように管理するのかをよく理解できなかったので、大きな回避策でしたが、一見問題なく機能しました。

私はそれに0xFFを与え、それを0xFF0として扱いました。結果は4,080でした。私は0x16を与え、0x160のように扱いました。結果は352です。何が起こっているのは明らかですが、なぜそれがわからないのですか。少なくとも、これまでのところ、問題はB16にしかありませんでしたが、B2は私にいくつかの奇妙なエラーも与えました。

int bin_to_int(char char_digit){ 
    char_digit = toupper(char_digit); 
     if (char_digit == '0') {return 0;} 
    else if (char_digit == '1') {return 1;} 
    else {return 2;} 
} 
int hex_to_int(char char_digit){ 
    char_digit = toupper(char_digit); 
     if (char_digit == '0') {return 0;} 
    else if (char_digit == '1') {return 1;} 
    else if (char_digit == '2') {return 2;} 
    else if (char_digit == '3') {return 3;} 
    else if (char_digit == '4') {return 4;} 
    else if (char_digit == '5') {return 5;} 
    else if (char_digit == '6') {return 6;} 
    else if (char_digit == '7') {return 7;} 
    else if (char_digit == '8') {return 8;} 
    else if (char_digit == '9') {return 9;} 
    else if (char_digit == 'A') {return 10;} 
    else if (char_digit == 'B') {return 11;} 
    else if (char_digit == 'C') {return 12;} 
    else if (char_digit == 'D') {return 13;} 
    else if (char_digit == 'E') {return 14;} 
    else if (char_digit == 'F') {return 15;} 
    else {return 16;} 
} 
void conv_todec(int mode_base){ 
    if (mode_base == 16){std::cout << "\nHex to Dec function";} 
    if (mode_base == 2){std::cout << "\nBin to Dec function";} 
    if (mode_base == 16){std::cout << "\nEnter a hex number: ";} 
    if (mode_base == 2){std::cout << "\nEnter a bin number: ";} 
    std::string numb; 
    std::cin >> numb; 
    int str_leg = numb.length(); 
    int total = 0; 
    for(int i(0);i<str_leg;i++){ 
     if (mode_base == 16){ 
      if (hex_to_int(numb[i]) == 16){func_erro();return;}} 
     if (mode_base == 2){ 
      if (bin_to_int(numb[i]) == 2){func_erro();return;}} 
     } 
    int digits[str_leg] = {}; 
    int j = str_leg; 
    for(int i(0);i<str_leg;i++){ 
    if (mode_base == 16) {digits[i] = hex_to_int(numb.at(i));} 
    if (mode_base == 2) {digits[i] = bin_to_int(numb.at(i));} 
    if (mode_base == 16) {total += (digits[i] * power(mode_base,j--));} 
    //Somehow the number never had the first digit claiming it as 
    //either even or odd, so I tried pre-decrementing 'j' and it 
    //worked for some reason I don't know either. 
    if (mode_base == 2) {total += (digits[i] * power(mode_base,--j));}} 
    std::cout << "The result is: " << total << std::endl; 
} 
+0

'hex_to_int'関数が不必要に長く、非効率的です –

答えて

0

この行は:

int j = str_leg; 

進FFのために、jが2であることを意味する。これは、後にあることを意味ここ

は(コード::ブロックGNUコンパイラの)コードでありますあなたが power(mode_base,j--)を最初の桁に乗じるときに power(16, 2)を実行します( j--jの値をとり、 jから1を引きますが、それでも元の値を使用することを意味します)。だから、最初の桁に256を掛け、16で乗算したいだけです。

解決策はありますか? jを1つ小さくしてください。あなたがjを減少しているとして、あなたはそれを使用する前に--jを使用するときに、あなたのバイナリバージョンが動作する理由

int j = str_leg - 1; 

注、これはあります。だから--jj = str_leg、またはj--j = strleg - 1のいずれかを使用してください。

また、モジュロ部品で作業すると、プログラムを書くのがはるかに簡単になります。

関連する問題