web-dev-qa-db-ja.com

入力として2進数を読み取る方法は?

ユーザーがCまたはC++で2進数を入力する方法はありますか?

私たちが次のようなものを書くと

int a = 0b1010;
std::cout << a << std::endl

次に、出力は10になります(適切なコンパイラ拡張を使用している場合)。

しかし、私たちが書き込もうとすると

int n;
std::cin >> n;
int t = 0bn;

エラーが発生するので、文字列を使用して入力を格納するのではなく、2進数を入力として直接読み取る方法を誰かが提案できますか?

9
iec2011007

ここには少し混乱があります。少し解きほぐしましょう。

  • 0b1010整数リテラルであり、基数2で記述された定数のコンパイル時整数値です。同様に、0xAは基数16のリテラルであり、10は基数10です。これらはすべて同じ整数を参照します。これは、コンパイラに意味する数値を伝える別の方法です。実行時、メモリ内では、この整数は常に2を底とする数値として表されます。

  • std::cout << a; aの整数値を取り、その文字列表現を出力します。デフォルトでは、基数10で出力されますが、 std::hex 基数16で出力する修飾子。バイナリで出力する定義済みの修飾子はありません。だからあなたはあなた自身でそれをする必要があります(またはグーグル、それは一般的な質問です)。

  • 0b最後に、整数リテラルを定義するためにonlyが使用されます。これはnotランタイム演算子です。すべてのintsは、メモリ内で基数2の数値として表されることを思い出してください。マシンの観点からは他のベースは存在しません。intintであるため、変換するものはありません。文字列から2進数を読み取る必要がある場合は、逆のコードをロールして、それを出力するようにします(std::cin >> nは、入力が基数10の数値であると想定しているため、入力が実際に基数2)であることが意図されている場合、誤った数値を読み取ります。

7

2進数を直接読み取る関数はありませんが、2進数(またはその他の基数の数値)を含む文字列を数値に変換する関数strtox(xはデータ型を表します)があります。 。

したがって、解決策は、最初に数値を文字列として読み取り、次にそれを変換することです。

例:

char input[100];
char *endpointer;

<read input using either C or C++ syntax>

int n = (int) strtol(input, &endpointer, 2);
7
Klas Lindbäck

むしろ自分でやってください:

uint32_t a = 0;

char c;
while ((c = getchar()) != '\n') { // read a line char by char
  a <<= 1;                        // shift the uint32 a bit left
  a += (c - '0') & 1;             // convert the char to 0/1 and put it at the end of the binary
}

printf("%u\n", a);
1
bumfo