任意のデジタル2進数、8進数、16進数C ++型変換

任意のデジタル2進数、8進数、16進数C ++型変換

通常、私たちはしばしば、変換のためのベースを操作するプログラムを書く過程で出会った、そして時には我々はすべて変換する機能を再定義する必要があり、幸いなことに、各書き込み追記;ここでは、ブロガーが、私は六角を書かれているものを共有していますそれを変換する方法は、比較的一般的です。

(例えば、患者は、ソースコードの思考スキップ尾を見ることができない)
最初の話私の考え(ここで説明したが、転送進数、16進数と同様の転送のアイデアを危うくする)
1、バイナリ整数形式の文字列に変換ストレージの形で、ここに画像を挿入説明
ここでブロガーがテンプレート関数を使用している、これは互換性の機能を高めることができ、そしてそれは私が使用されるバイナリ法に変換する場合、オペレーティング・ビット操作を行うので、利益が大幅に改善されることですプログラムの効率は
わずかこここのアルゴリズムのロジックを説明している:
例えば、私たちの例で渡されたパラメータは10で
、我々はバイナリ形式10に変換したい;
10は、コンピュータ自身のメモリアドレスにバイナリ形式で保存されている
10 (バイナリ1010)
進数の最上位ビットは4であり
、この手段は1左ことで、1 << 3 3 0001(1)=> 1000(8)
10&(1 << 3)=> 1010・1000年
・オペレータには、同じ位置のオペレータの位置であり、2ビットのバイナリ数の意味は何1であるものに基づいている場合
、次いで1または0に発現評価さ
10&(1 << 3)= > 1010&1000年1 =
10&(1 << 2)=> 0 = 1010&100
10&(1 << 1)=> 1 = 1010&10
10&(1 << 0)=> 1010&

2、バイナリの長さを取得し、ゼロをリードしていない場合は、3の倍数である;
ここに画像を挿入説明
この手順は、次のステップは説明することです参照してくださいかなぜ「0」を埋めるために使用されます

3、文字列は、我々は2にとしてそれを取るよ、このような「010」のように分割(グループとして3つ)になり
ここに画像を挿入説明
、我々はサブバイナリ文字を入れているので、これは、我々は3の倍数にバイナリ文字列を補完すべき理由3のランレングスは、「001010100」=「」001「」010「」100 "などのグループに分割され
た文字列には、(スイッチタイプがデジタル比較することができる)場合、私たちが他の場合を使用して示され
、このステップの次の処理します動作中:
例バイナリ変換市に渡さ1259 =「10011101011
ゼロパディング= "010 011 101 011
スプリット=" 010011101011
一致=「--2 3 ---- ---- ---- 3. 5。

図4は、文字列変数のs_octは、上記反復の結果を統合され定義する;
この動作ステップは、単純な文字列s_oct =「\ 0」の定義であり、
工程が--2 ---- 3の上方に取得させた後- --5 3 ----。
互いに重畳の各デジタルストリング:
。s_oct 3 + 2 + + + 5.3 = 2353

図5に示すように、最終的な出力s_oct;
進形式は、1259年に2353であり、
戻りs_oct。

ケース全体のソースコード

template<typename T>
string to_binary(T num,int n){
    string s_bin="\0",s_oct="\0",s_hex="\0";
    int i = sizeof(T)*8-1;
    while(!(num & (1<<i))){
        i--;
    }
    for(int j=i;j>=0;j--){
        if(num & (1<<j)){
            s_bin += "1";
        }
        else{
            s_bin += "0";
        }
    }
    if(n == 2){
        return s_bin;
    }
    if(n == 8){
        while(s_bin.length()%3!=0){
            s_bin = "0"+s_bin;
        }
        for(int j=0;j<(int)s_bin.length();j+=3){
            string sub_str = s_bin.substr(j,3);// 注意substr的第一个参数代表起始点 第二个参数代表偏移量
            if(sub_str == "000"){s_oct += "0";}
            else if(sub_str == "001"){s_oct += "1";}
            else if(sub_str == "010"){s_oct += "2";}
            else if(sub_str == "011"){s_oct += "3";}
            else if(sub_str == "100"){s_oct += "4";}
            else if(sub_str == "101"){s_oct += "5";}
            else if(sub_str == "110"){s_oct += "6";}
            else if(sub_str == "111"){s_oct += "7";}
        }
       return s_oct;
    }
    if(n == 16){
        while(s_bin.length()%4!=0){
            s_bin = "0"+s_bin;
        }
        for(int j=0;j<(int)s_bin.length();j+=4){
            string sub_str = s_bin.substr(j,4);
            if(sub_str == "0000"){s_hex += "0";}
            else if(sub_str == "0001"){s_hex += "1";}
            else if(sub_str == "0010"){s_hex += "2";}
            else if(sub_str == "0011"){s_hex += "3";}
            else if(sub_str == "0100"){s_hex += "4";}
            else if(sub_str == "0101"){s_hex += "5";}
            else if(sub_str == "0110"){s_hex += "6";}
            else if(sub_str == "0111"){s_hex += "7";}
            else if(sub_str == "1000"){s_hex += "8";}
            else if(sub_str == "1001"){s_hex += "9";}
            else if(sub_str == "1010"){s_hex += "A";}
            else if(sub_str == "1011"){s_hex += "B";}
            else if(sub_str == "1100"){s_hex += "C";}
            else if(sub_str == "1101"){s_hex += "D";}
            else if(sub_str == "1110"){s_hex += "E";}
            else if(sub_str == "1111"){s_hex += "F";}
        }
        return s_hex;
    }
    return "EOF";
}
公開された27元の記事 ウォン称賛62 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_42359956/article/details/87625522