C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: [C#] 10進数の数字を、他の8進数や16進数に変換したい


(過去ログ 116 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■68423 / inTopicNo.1)  [C#] 10進数の数字を、他の8進数や16進数に変換したい
  
□投稿者/ そる (3回)-(2013/10/21(Mon) 01:01:16)

分類:[C#] 

すみません、先ほど投稿した際に何かのバグで3連投になってしまったので、もう一度投稿させていただきます。

本文の通りなのですが、
10進数の数字を入力して、他の2進数や8進数、16進数など、どの進数にも変換できるプログラムを作りたいです。
そして、例えば、10進数を16進数に変換する時に、
16進数の実際の表記方法である、10をAとしたり、11をBとして表記させたいです。

現段階のプログラムは以下の通りです。
どなたか修正していただけないでしょうか。

using System;
using System.Collections;
namespace csstack
{
class Class1
{
static void Main(string[] args)
{
int num, baseNum;
string again = "y"; //do it again
Console.WriteLine();
while ((again == "y") || (again == "Y"))
{
Console.Write("Enter a decimal ynumber: ");
num = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter a base: ");
baseNum = Convert.ToInt32(Console.ReadLine());
Console.Write(num + " converts to ");
MulBase(num, baseNum);
Console.WriteLine(" in Base-" + baseNum);
Console.Write("\nDo it again? Anwer 'y' or 'N':\t");
again = Console.ReadLine();

}
Console.WriteLine();
}

static void MulBase(int n, int b)
{
Stack digits = new Stack();
do
{
digits.Push(n % b);
n /= b;
} while (n != 0);
while (digits.Count > 0)
Console.Write(digits.Pop());

}
}
}
引用返信 編集キー/
■68424 / inTopicNo.2)  Re[1]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ daive (17回)-(2013/10/21(Mon) 06:07:08)
検索ワード

dobon 8進数
dobon 書式
16進数、8進数、2進数の文字列を整数に変換する
整数を16進数、8進数、2進数の文字列に変換する

迷惑投稿以来調子が悪い様子。
引用返信 編集キー/
■68427 / inTopicNo.3)  Re[1]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ shu (399回)-(2013/10/21(Mon) 11:19:11)
No68423 (そる さん) に返信

2,8,16だけならConvert.ToStringが良いと思います。


そるさんの提示コードで
> Console.Write(digits.Pop())
とありますがこれだと10進まではよいのですが
11以上だと10,11,12,・・・のように出力されるので
10と出力された場合に2桁の1と0なのか1桁の10なのか
分からなくなります。通常16進数では10〜15をA〜Fで
表しますのでそのような変換をする必要があります。
引用返信 編集キー/
■68431 / inTopicNo.4)  Re[2]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ kaina (1回)-(2013/10/21(Mon) 12:37:43)
よくあるタイプの課題だなあ。

まあ、学校か会社の課題かは知らないけれど、
ここで答えを教えてもらってそれを丸写しで持って行っても
本当の意味で理解して作らないと意味が無いですよ。

学校だったら無いかもしれないけれど、
会社の課題だったら理解して無いで
作られてものって結構分かっちゃうよ。

引用返信 編集キー/
■68435 / inTopicNo.5)  Re[2]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ スコール (5回)-(2013/10/21(Mon) 13:15:57)
MulBase()内の

while (digits.Count > 0)
Console.Write(digits.Pop());

を以下のようにかえる。

while (digits.Count > 0)
{
int num = (int)digits.Pop();
char num_char = (char)((num < 10) ? ((int)'1' + num - 1) : ((int)'A' + num - 10));
Console.Write(num_char);
}

引用返信 編集キー/
■68454 / inTopicNo.6)  Re[3]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ そる (4回)-(2013/10/22(Tue) 05:03:11)
レスポンスしていただいた方々、ありがとうございます。

スコールさんの言っていただいたプログラムで解決したのですが、
kainaさんが言われるように、自分で分からないと意味が無いのは本当にそうだと思います。

申し訳ないのですが、どなたかスコールさんの追加されたプログラムの動きの説明をしていただけないでしょうか。
引用返信 編集キー/
■68457 / inTopicNo.7)  Re[4]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ スコール (6回)-(2013/10/22(Tue) 09:33:45)
私のコードを理解するには、文字も内部データ的には数字であることを理解
する必要があります。
以下のページがいいかな。
http://e-words.jp/p/r-ascii.html

たとえば、'B'という文字なら、
内部データ的な数字は10進数で66(16進数で42)になります。

コンピュータ内部では全ての文字はこのような数字(文字コード)によって記
憶されているわけです。
それを画面に表示する際に、人間が見て分かる形(フォント)で表示している
だけなんですね。

で、もう一度、文字コード表を見てください。
0〜9, A〜Zの文字コードは連番であることが分かります。

> int num = (int)digits.Pop();
で数字を取得した後、文字に変換する際に、この文字コードが連番であるこ
とを利用します。

> char num_char = (char)((num < 10) ? ((int)'1' + num - 1) : ((int)'A' + num - 10));
は、numの値が10未満の時は以下の処理になるのは分かるかと思います。

char num_char = (char)((int)'1' + num - 1);

上記コード中の
(int)'1' + num - 1
の部分は文字コードの計算です。
(int)'1'
は文字'1'の文字コードを返します。つまり、10進数で49です。
その値に文字コードのオフセット分を足し込みます。
仮に num == 2 なら、オフセット分は num - 1 = 2 - 1 = 1です。
49から1オフセットして50となり、文字コード50の文字は'2'であり、めでた
く数字の2を文字の'2'の文字コードに変換できたことになります。
そのままでは文字コード(= 数字)なので最後にchar型でキャストして文字化
完了です。

10以上の時も同じです。

char num_char = (char)((int)'A' + num - 10));

10を超えた分のオフセット(num - 10)を'A'の文字コードからオフセットすれ
ば、'A'〜の文字コードを得られるわけです。

引用返信 編集キー/
■68547 / inTopicNo.8)  Re[5]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ そる (5回)-(2013/10/27(Sun) 01:34:32)
分かりやすい説明、ありがとうございました。
引用返信 編集キー/
■68548 / inTopicNo.9)  Re[6]: [C#] 10進数の数字を、他の8進数や16進数に変換したい
□投稿者/ そる (6回)-(2013/10/27(Sun) 01:34:54)
解決済みにチェックを入れておきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -