7
string convert_binary_to_hex(string binary_value, int number_of_bits)
{
    bitset<number_of_bits> set(binary_value);   
    ostringstream result;
    result << hex << set.to_ulong() << endl;
    return result.str();
}

上記の方法では、2進文字列を16進文字列に変換しています。16進値は4ビットであるため、number_of_bits変数は4の倍数である必要がありますbinary_value。これは、私が作成しているアプリケーションでは、が4ビットから256ビットの範囲である可能性があるためです。

ビットセットを可変サイズにする方法を教えてください。

私の輸入品:

#include <stdio.h>
#include <iostream>
#include <string>
#include <bitset>
#include <sstream>
4

6 に答える 6

8

できません。コンパイラは渡された値に基づいて異なるコードを生成する必要があるため、このようなテンプレートパラメータはコンパイル時に知る必要があります。

この場合、代わりに文字列を反復処理して、自分で値を作成する必要があります。たとえば、

unsigned long result = 0;
for(int i = 0; i < binary_value.length(); ++i)
{
    result <<= 1;
    if (binary_value[i] != '0') result |= 1;
}

これはまた、結果がlongよりも短いことを前提としており、256ビット値に対応しませんが、サンプルコードにも対応しません。そのためには大きな数の型が必要になります。

于 2011-03-17T15:44:42.350 に答える
5

std::bitsetのサイズは、統合されたテンプレートパラメータであるため、コンパイル時の既知の定数(定数式)のみにすることができます。定数式には、定数リテラルおよび/または定数式で初期化された定数整数変数が含まれます。

例えば

std::bitset<4> q; //OK, 4 is a constant expression
const int x = 4;
std::bitset<x> qq; //OK, x is a constant expression, because it is const and is initialized with constant expression 4;
int y = 3;
const int z = y;
std::bitset<z> qqq; //Error, z isn't a constant expression, because even though it is const it is initialized with a non-constant expression

動的な(コンパイル時は不明)サイズの代わりに、std::vector<bool>またはboost::dynamic_bitsetここにリンク)を使用します。

于 2011-03-17T15:43:20.823 に答える
3

テンプレートではありませんstd::bitset。コンパイル時にサイズを指定する必要があります。

convert_binary_to_hex自分でテンプレートを作成する必要があります。サイズが実行時にのみわかっている場合は、別の解決策を見つける必要があります。

template<size_t number_of_bits>
string convert_binary_to_hex(string binary_value)
{
   bitset<number_of_bits> set(binary_value);   
   ostringstream result;
   result << hex << set.to_ulong() << endl;
   return result.str();
}
于 2011-03-17T15:44:58.040 に答える
2

コンパイル時にサイズがわかる場合は、メソッドもテンプレートにします。そうでない場合は、とにかくstd::vector<bool>1ビットのみを使用するように実際に特化されたメソッドを使用する必要がありますが、orとビットシフトを使用して手動でビルドする必要があります。boolulong

//template version
template <size_t number_of_bits>
string convert_binary_to_hex(string binary_value) {
    bitset<number_of_bits> set(binary_value);
    ostringstream result;
    result << hex << set.to_ulong() << endl;
    return result.str();
} 

しかし、あなたはすでにulongビット数を保持するのに十分な大きさであると想定しているので、そしてあなたが与えたコードに対してビットが多すぎても違いはないので、なぜそれをulong?_

//reuses ulong assumption
string convert_binary_to_hex(string binary_value) {
    bitset<sizeof(ulong)> set(binary_value);
    ostringstream result;
    result << hex << set.to_ulong() << endl;
    return result.str();
} 

または、2つの関数を使用することもできます。1つは4ビット数の実際の変換を実行し、もう1つはその関数を使用して任意の長さの数を作成します。

string convert_nibble_to_hex(string binary_value) {
    bitset<4> set(binary_value);
    ostringstream result;
    result << hex << set.to_ulong() << endl;
    return result.str();
}

string convert_binary_to_hex(string binary_value) {
    //call convert_nibble_to_hex binary_value.length()/4 times
    //and concatenate results
}
于 2011-03-17T15:46:02.160 に答える
2

私が覚えている限り、この問題を回避するためにテンプレートを使用できます。

template <size_t number_of_bits>
    string convert_binary_to_hex(string binary_value)
    {
        bitset<number_of_bits> set(binary_value);   
        ostringstream result;
        result << hex << set.to_ulong() << endl;
        return result.str();
    }

次に、次のように呼び出します。

convert_binary_to_hex<32>(12345678);

定数のみを渡すことができますが、すべての呼び出しで別の定数を取得できることに注意してください:)

于 2011-03-17T15:46:50.073 に答える
1

1つの8ビット文字には常に正確に2桁の16進数が必要であるという事実を利用できます。文字列全体を同時にビットシーケンスに変換する必要はありません。文字列要素は個別に処理できます。

string convert_octets_to_hex(string value)
{
    string result(2*value.size());
    for( int i = 0; i < value.size(); i++ ) {
        result[2*i]   = "0123456789abcdef"[(value[i] >> 4) & 0x0f];
        result[2*i+1] = "0123456789abcdef"[value[i] & 0x0f];
    }
    return result;
}

ああ、あなたは1ビットの文字列を持っているようです。同じように処理できます。

string convert_binary_to_hex(string binary_value, int number_of_bits = -1)
{
    if (number_of_bits < 0) number_of_bits = binary_value.size();
    string result((number_of_bits + 3) / 4, '\0');

    unsigned work;
    char* in = &binary_value[0];
    char* out = &result[0];
    if (number_of_bits & 3) {
        work = 0;
        while (number_of_bits & 3) {
            work <<= 1;
            work |= *(in++) & 1;
            number_of_bits--;
        }
        *(out++) = "0123456789abcdef"[work];
    }
    while (number_of_bits) {
        work = ((in[0] & 1) << 3) | ((in[1] & 1) << 2) | ((in[2] & 1) << 1) | (in[3] & 1);
        in += 4;
        *(out++) = "0123456789abcdef"[work];
        number_of_bits -= 4;
    }
    return result;
}

編集:いくつかのバグを修正し、デモを追加しました

于 2011-03-17T15:48:13.827 に答える