3

以下に示すように、stoi を使用して C++ で符号付き 2 進数の文字列を 10 進数値に変換しようとしています。

 stoi( binaryString, nullptr, 2 );

私の入力は 2s 形式のバイナリ文字列で、桁数が 8 である限り、stoi は正常に機能します。たとえば、「1100」は 12 という結果になります。

ただし、4 ビット システムの場合、2s 形式の 1100 は -4 に等しくなります。C ++で任意のビット長2の数値に対してこの種の変換を行う方法の手がかりはありますか?

4

5 に答える 5

4

ビット数が少ない数値の符号を処理します。

  • 2 進数を変換 -> 10 進数
  • 符号付きビットが設定されている場合は、2 の補数を計算します (符号ビットが語長に依存している場合)。

.

#define BITSIZE 4
#define SIGNFLAG (1<<(BITSIZE-1)) // 0b1000
#define DATABITS (SIGNFLAG-1)     // 0b0111

int x= std::stoi( "1100", NULL, 2);  // x= 12 
if ((x & SIGNFLAG)!=0) {        // signflag set
    x= (~x & DATABITS) + 1;     // 2s complement without signflag
    x= -x;                      // negative number
}
printf("%d\n", x);              // -4
于 2013-06-05T19:18:14.460 に答える
2

を使用できますstrtoul。これは、署名されていない同等のものです。unsigned long唯一の違いは、 ではなく を返すことintです。

于 2013-06-05T18:15:54.030 に答える