C ライブラリに 10 進数を 2 進数に変換し、配列の位置に数値を保存する関数があるかどうかを知りたいです。例: 2 -> 10 -> 配列 [0] = 0 配列 [1] = 1。
7 に答える
ここ:
void dec2bin(int c)
{
int i = 0;
for(i = 31; i >= 0; i--){
if((c & (1 << i)) != 0){
printf("1");
}else{
printf("0");
}
}
}
ただし、これは整数の値をバイナリ形式で出力するだけです。とにかく、すべてのデータは内部的にバイナリ形式で表されます。
10 進数とは何かを定義していません。その数字の文字表現(ASCIIなど)だと思います。
数字は単なる数字であることに注意してください。2 進数または 10 進数は存在しませんが、特定の数値には 2 進数と 10 進数の表現がある場合があります。数字は数字ではありません!
次に、おそらくsscanf(3)またはstrtol(3) pratoi
で文字列を整数 (たとえば anint
または a long
)に変換し、 snprintf(3)で整数を文字列に変換します。
0
数値を (または-sのみを含む) バイナリ文字列に変換する場合は、1
char
その変換を自分でコーディングする必要があります。バイナリ文字列を何らかのlong
用途に変換するにはstrtol
。
C 標準ライブラリにはそのような関数はありません。とにかく、あなたはあなた自身を書くことができます:
void get_bin(int *dst, intmax_t x);
dst
は結果の配列 ( s1
と0
s を含む) で、x
は 10 進数です。
例えば:
C89 バージョン:
#include <limits.h>
void get_bin(int *dst, int x)
{
int i;
for (i = sizeof x * CHAR_BIT - 1; i >= 0; --i)
*dst++ = x >> i & 1;
}
C99 バージョン:
/* C99 version */
#include <limits.h>
#include <stdint.h>
void get_bin(int *dst, intmax_t x)
{
for (intmax_t i = sizeof x * CHAR_BIT - 1; i >= 0; --i)
*dst++ = x >> i & 1;
}
次のように動作します: のバイナリ表現をx
左から右に実行します。式は- 1(sizeof x * CHAR_BIT - 1)
のビット数を与えます。次に、各ビットの値 ( ) を取得し、それを配列にプッシュします。x
*dst++ = x >> i & 1
活用例:
void get_bin(int *dst, int x)
{
int i;
for (i = sizeof x * CHAR_BIT - 1; i >= 0; --i)
*dst++ = x >> i & 1;
}
int main(void)
{
int buf[128]; /* binary number */
int n = 42; /* decimal number */
unsigned int i;
get_bin(buf, n);
for (i = 0; i < sizeof n * CHAR_BIT; ++i)
printf("%d", buf[i]);
return 0;
}
char * itoa ( int value, char * str, int base );
詳細はこちら...を使用します。