0

ねえ、16 進文字に基づいて 4 ビット ビットセットをインスタンス化する方法を見つけようとしています。たとえば、値が「F」の文字がある場合、1111 に初期化されたサイズ 4 のビットセットを作成したい、または A の場合は 1010 に初期化したい。 :

fn(char c)
{
  bitset<4> temp;

  if(c == 'F')
    temp.set();

  //...

  if(c == '9')
  {
    temp.set(1);
    temp.set(3);
  }

  //...

}

これは効率的ではありません。文字列を 10 進整数に簡単に変換し、int の最後の 4 ビットを使用してビットセットを構築する方法はありますか?

助けてくれてありがとう。

4

5 に答える 5

2

その型には、を受け入れるコンストラクターunsigned longがあります。文字を対応する整数値に変換し、それを使用して abitsetを構築します。

std::bitset<4> temp(hexchar_to_int(c));

仮説hexchar_to_intは好きなように実装できます。あなたはそのために使うかもしれませんstrtoul。例えば:

unsigned long hexchar_to_int(char c) {
  char chars[2] = {c, '\0'};
  return strtoul(chars, NULL, 16);
}
于 2010-05-12T05:01:03.157 に答える
1

前述のようにlong、コンストラクタには が必要です。どうやってそれを手に入れますか?ルックアップ配列を設定します。

const int BASE = MIN('0', MIN('a', 'A')); // std::min isn't an ICE
const int SIZE = MAX('9', MAX('f', 'F')) - BASE;
long lookup[SIZE];
lookup['0' - BASE] = 0; lookup['1' - BASE] = 1;
lookup['2' - BASE] = 2; lookup['3' - BASE] = 3;
lookup['4' - BASE] = 4; lookup['5' - BASE] = 5;
lookup['6' - BASE] = 6; lookup['7' - BASE] = 7;
lookup['8' - BASE] = 8; lookup['9' - BASE] = 9;
lookup['A' - BASE] = 10; lookup['a' - BASE] = 10;
lookup['B' - BASE] = 11; lookup['b' - BASE] = 11;
lookup['C' - BASE] = 12; lookup['c' - BASE] = 12;
lookup['D' - BASE] = 13; lookup['d' - BASE] = 13;
lookup['E' - BASE] = 14; lookup['e' - BASE] = 14;
lookup['F' - BASE] = 15; lookup['f' - BASE] = 15;
// ...
inline std::bitset<4> BitsFromChar(char c) {
  return lookup[c-BASE];
}
于 2010-05-12T11:44:07.460 に答える
0

16 進文字を変換するには、この関数を試してください (大文字と小文字の両方を処理します)。次に、結果をbitsetコンストラクターに渡します。最初に入力が有効であることを確認する必要があります!

int HexLetterToInt(char input) 
{ 
    if(input >= '0' && input <= '9') 
    { 
        input -= '0'; 
    } 
    else if(input >= 'A' && input <= 'F') 
    { 
        input -= 'A' - 10;
    } 
    else if(input >= 'a' && input <= 'f') 
    { 
        input -= 'a' - 10;
    } 
    else 
    { 
        // Not a valid character
        input = -1;
    } 
    return input; 
}
于 2010-05-12T04:54:49.647 に答える
0

std::bitsetを取るコンストラクタがありますunsigned long。あなたはそれを使うことができます:

void fn( char c ) {
    if ( c >= '0' && c <= '9' ) {
      bitset<4> temp( c - '0' );
      ...
    }
    if ( c >= 'A' && c <= 'F' ) {
      bitset<4> temp( c - 'A' + 0xA );
      ...
    }
    if ( c >= 'a' && c <= 'f' ) {
      bitset<4> temp( c - 'a' + 0xA );
      ...
    }

}
于 2010-05-12T04:56:17.377 に答える
0

もう一つの方法..

void fn(char c)
{
    unsigned int hexValue = 0;
    char str[2] = {c, '\0'};
    sscanf(&str, "%X", &hexValue);
    bitset<4> temp(hexValue);
}
于 2010-05-12T05:32:26.890 に答える