2進数を10進数にする。
またその逆の10進数を2進数にした時の値の2つが
知りたいのです。
00010100だと10進数では20になりますよね。
この位なら、良いのですけど、
11010110見たいに複雑になってくると解りません。

言語が関係あるか解りませんがC言語しか使えません。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんにちは、su-zy-kiともうします。


2進を10進に、またその逆をおこなうプログラムを作りたいのでしょうか?
それとも、紙と鉛筆による方法が知りたいのでしょうか?
私は、プログラムに関する知識があまりないのでプログラムに関しては答えられませんが自分で計算する方法でよろしければわかります。

まず2進から10進ですが、たとえば(11010110)の場合ですと

       128 64 32 16 8  4  2  1
左から順に(1  1  0  1  0  1  1  0)
という感じで上に1、2、4・・・・数字を振っていきます。
次に2進で1の所の数字を足していきます。
2+4+16+64+128
これを計算すると214になります。
これが2進数の(11010110)を10進数で表した数字です。

10進を2進にする方法ですが、214を2進数にするときは、
214を2で割ります。
割り切れるので2進数の一番左は0になります
214を2で割った数107を2で割ると割り切れないので2進の次の数字は1になります。こんな感じで計算します
               
214 ÷ 2 = 107 ・・・ 0
107 ÷ 2 = 53  ・・・ 1
53  ÷ 2 = 26  ・・・ 1
26  ÷ 2 = 13  ・・・ 0
13  ÷ 2 = 6   ・・・ 1
6   ÷ 2 = 3   ・・・ 0
3   ÷ 2 = 1   ・・・ 1
1   ÷ 2 = 0   ・・・ 1
割り算のあまりを並べると(11010110)になりこれが214を二進で表した数字になります。  
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/02/16 13:33

NO.2で回答されている方法がオーソドックスです。



ただ、質問者は20位の数字なら即座に変換できるようなので、16進数を仲介する方法がいいと思います。(4ビットづつ区切ります)
「1101 0100」は16進数で「13 4」(本当は13でなく「D」)ですがこれから 13×16+4=208+4=212 という風に求められます。
重みは、下から、1、16、256、4096、と言う風になります。

10進数から2進数への変換は、2の代わりに16を使って割り算をしていきます。方法は、NO.2を参考にしてください。これで出た、16進数の並びを4ビット区切りのビット列にすれば、それが答えです。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/02/16 13:31

10進→2進変換を書き忘れてたので追加。


printf() でできれば良いんだけど、多分ないと思う。

で、色々方法はあるが、こんな風にしちゃえば良いんじゃないだろうか。

n が32ビットの整数の場合。
int i;
for (i = 0; i < 32; i++, n <<= 1)
 putchar((n & 0x80000000) ? '1' : '0');putchar('\n');
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/02/16 13:33

CでもC++でもstrtol() が使えると思う。



例)
long n = strtol("101101110101011", NULL, 2);

こんな感じで long の変数に入れたあとで printf("%ld\n", n); のようにすると10進数として出力される。
詳細は UNIX 系 OS の場合は man strtol で見て。
(Windows の場合はコンパイラ付属のヘルプに入ってると思う)
C言語の入門書とかにも書いてあると思う。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/02/16 13:34

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語 2次方程式を解くプログラムについて

 学校でC言語を使って、実数解をもつ簡単な2次方程式を解くプログラムを作れという課題がでました。まだ初心者で何をどうしたらいいかわからない状態です。簡単なプログラムを作ってくださいm(__)m

Aベストアンサー

2次方程式の根と係数の関係を知っているでしょう ?
それを使えばいいのではないの ?
他人にプログラム作成を依頼すると色々と高くつきますよ。

Qn進数の値を10進数の値に変換するには?

こんにちは。

C言語において、n進数の値を10進数の値に変換する方法を考えています。
例えば、2進数の101を、10進数で表すと5になります。
これを関数化し、
n_to_m(int x, unsigned n); といったプロトタイプで、
渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。
逆に、10進数の値を、n進数の値に変換する関数も一緒に作りたいと考えています。
何かいい方法を思いついた方がいらっしゃれば、是非アドバイスを頂きたいと思います。
では、よろしくお願い致します。

Aベストアンサー

>n_to_m(int x, unsigned n); といったプロトタイプで、
>渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。

変換後の10進数を戻り値とする必要がありそうであるのと、
n_to_mという名前では何のことやらよくわからなそうなので、
こんなプロトタイプがいいのではないかと思います。

int toDecimal(int x, unsigned int n);

1)変換結果を格納する変数を0で初期化する。
2)変換元が0でない間、2-1)~2-3)を繰り返す。
2-1)変換元を10で割った剰余がn未満ならば、変換結果に加える。
2-2)変換元を10で割った剰余がn以上ならば、変換元の数値をn進数で表現できないため、
エラーとする。エラー時の戻り値をどうするかは考えてみてください。
2-3)変換元を10で割った商を、新たな変換元とする。
3)求めた変換結果を呼び出し元へ返す。

こんなところでしょうか。

Qn進数を10進数に変換するプログラムがわかりません

整数n(2<=n<=16)とn進数の数字列digitsを与えると10進数に変換して表示するプログラム
関数void base2dec(int n, string digits, int &dec)を使用する

実行例 110101(2)=53
123(8)=83
7ACE(16)=31438
以下はとりあえずつくったみたプログラムです
#include<iostream>
#include<string>
using namespace std;
void base2dec(int n, string digits, int &dec)
{
int i,x=0;
for(i=0; i=digits.size()-1; i++)
{
if(n<10)
{
x=digits[i]-'0';
}
else
{
x=digits[i]-'A'+10;
}
dec=(x*n);
if(cin >> digits[i++])
{
if(n<10)
{
dec=dec+(digits[i++]-'0');
}
else
{
dec=dec+(digits[i++]-'A'+10);
}
}
}
int value = dec;
}

int main()
{
int n,value;
string digits;
cout << "何進数ですか-->";
cin >>n;
cout << "数字列を入力してください-->";
cin >>digits;;
base2dec(n,digits,value);
cout << digits << "(" << n << ")=" << value << endl;
return 0;
}

void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。ちなみにn進数から10進数に直す方法は理解しています。

整数n(2<=n<=16)とn進数の数字列digitsを与えると10進数に変換して表示するプログラム
関数void base2dec(int n, string digits, int &dec)を使用する

実行例 110101(2)=53
123(8)=83
7ACE(16)=31438
以下はとりあえずつくったみたプログラムです
#include<iostream>
#include<string>
using namespace std;
void base2dec(int n, string digits, int &dec)
{
int i,x=0;
for(i=0; i=digits.size()-1; i++)
{
if(n<10)
{
x=digits[i]-'0';
}
else
{
...続きを読む

Aベストアンサー

★アドバイス
>for(i=0; i=digits.size()-1; i++){
 ↑
 この行がおかしいです。
 間違い⇒for(i=0; i=digits.size()-1; i++){
 正しい1⇒for(i=0; i<=digits.size()-1; i++){
 正しい2⇒for(i=0; i<digits.size(); i++){
 ※回答者 No.1 さんのアドバイス通りです。
>void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。
 ↑
 『dec=(x*n);』ここが違う気がします。
 『dec=(dec*n+x);』とすればいいと思いますけど。
>ちなみにn進数から10進数に直す方法は理解しています。
 ↑
 理解しているのなら『dec=(dec*n+x);』となると思いますが…。

その他:
>if(cin >> digits[i++]){ … }
 ↑
 このifブロック内は必要なのか?
 どういう意味。
>int value = dec;
 ↑
 最後のこの行は意味ないね。
 『value』を参照してないし。
 戻してないし。
 そもそも dec が『参照』ですよ。
 http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/node8.html→『ポインタと参照』
 このリンクを読みましょう。
・以上。あと16進などのA~Fは大文字専用ですね。小文字だと上手く変換できませんよ。

参考URL:http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/node8.html

★アドバイス
>for(i=0; i=digits.size()-1; i++){
 ↑
 この行がおかしいです。
 間違い⇒for(i=0; i=digits.size()-1; i++){
 正しい1⇒for(i=0; i<=digits.size()-1; i++){
 正しい2⇒for(i=0; i<digits.size(); i++){
 ※回答者 No.1 さんのアドバイス通りです。
>void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。
 ↑
 『dec=(x*n);』ここが違う気がします。
 『dec=(dec*n+x);』とすればいいと思いますけど。
>ちなみにn進数から10進数に直す方法...続きを読む

QC言語 10進数→2進数

キーボードで入力された1以上の正の整数n(1~15)を2進数(4bit)で出力するプログラムを作りたいんですが、
出力例に書かれている内容、

-出力例-

正の整数:12
整数 12 を2進数表記すると下位bitより 0011 となります。

----

上記の下位bit、というのはどういう意味でしょうか?

また、この下位bitというものをどうやってプログラム上で
表記すればいいのでしょうか?
教えてください。

Aベストアンサー

bitは10進数でいうところの桁のような意味で
数値が下の桁から順に書かれているということです.
下位bitより0011 = 上位ビットより1100 = 2^3 + 2^2 = 12 です.

プログラムは参考URLを見ればすぐ作成できると思います.
上位bitからの出力になっているので,そこを変更すればできます.

参考URL:http://www.geocities.jp/KY_webid/c/049ans.html

QC言語で2桁Hex文字列を10進数値に変換する方法

C初心者です。よろしくお願いします。

測定器からシリアルで送られてくる2桁のHexデータ(リトルエンディアン)を10進数値に変換したいのですが、ネットでいろいろ調べてもよく解りません。
ネット上にあったプログラムを参考にして、次のようにやっています。

char d[3]; //受信データ

// データ受信処理後
int i=0, c=0, n;

while(d[i] != '\0'){
n = n * 0x10;
c = d[i++];

if((c >= '0') && (c <= '9')){
n += c - '0';
}
else if((c >= 'A') && (c <= 'F')){
n += c - 'A' + 10;
}
}
printf("%d\n",n);

結果を表示すると’0’になってしまいます。

どこがダメなのか、よろしくお願いします。

Aベストアンサー

>d[0], d[1], d[2] は間違いなく入っています。例えばd[0]=E5、d[1]=03という具合です。

なるほど、そういうことですね。
質問のところにあるプログラムは、HEX文字列を数値に変換するためのものです。
一方、測定器から送られてくるデータは、数値そのものです。

補足にあった配列の場合、リトルエンディアンですから、
0x03E5が、送信されたデータですね。
リトルエンディアンなので、プログラム的には面倒なのですが
2バイト固定ならば

int n ;
n = d [0];
n += d[1] << 8;

こんな感じで、変換できます。
(チェックはしていないので、不具合があったらフォローします。)


このカテゴリの人気Q&Aランキング

おすすめ情報