ユーザーがCまたはC++で2進数を入力する方法はありますか?
私たちが次のようなものを書くと
int a = 0b1010;
std::cout << a << std::endl
次に、出力は10になります(適切なコンパイラ拡張を使用している場合)。
しかし、私たちが書き込もうとすると
int n;
std::cin >> n;
int t = 0bn;
エラーが発生するので、文字列を使用して入力を格納するのではなく、2進数を入力として直接読み取る方法を誰かが提案できますか?
ここには少し混乱があります。少し解きほぐしましょう。
0b1010
は整数リテラルであり、基数2で記述された定数のコンパイル時整数値です。同様に、0xA
は基数16のリテラルであり、10
は基数10です。これらはすべて同じ整数を参照します。これは、コンパイラに意味する数値を伝える別の方法です。実行時、メモリ内では、この整数は常に2を底とする数値として表されます。
std::cout << a
; a
の整数値を取り、その文字列表現を出力します。デフォルトでは、基数10で出力されますが、 std::hex
基数16で出力する修飾子。バイナリで出力する定義済みの修飾子はありません。だからあなたはあなた自身でそれをする必要があります(またはグーグル、それは一般的な質問です)。
0b
最後に、整数リテラルを定義するためにonlyが使用されます。これはnotランタイム演算子です。すべてのint
sは、メモリ内で基数2の数値として表されることを思い出してください。マシンの観点からは他のベースは存在しません。int
はint
であるため、変換するものはありません。文字列から2進数を読み取る必要がある場合は、逆のコードをロールして、それを出力するようにします(std::cin >> n
は、入力が基数10の数値であると想定しているため、入力が実際に基数2)であることが意図されている場合、誤った数値を読み取ります。
2進数を直接読み取る関数はありませんが、2進数(またはその他の基数の数値)を含む文字列を数値に変換する関数strtox
(xはデータ型を表します)があります。 。
したがって、解決策は、最初に数値を文字列として読み取り、次にそれを変換することです。
例:
char input[100];
char *endpointer;
<read input using either C or C++ syntax>
int n = (int) strtol(input, &endpointer, 2);
むしろ自分でやってください:
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);