質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

7906閲覧

2進数->10進数に変換するプログラムを作りたいです。

whitehorse85921

総合スコア34

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/08/07 14:24

編集2019/08/07 15:01

前提・実現したいこと

2進数から10進数に変換するプログラムを作りたいです。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーは無いのです。 ただ、例えば、2進数「1000」を文字列として入力した後、2進数「1000」を反転させ「0001」とします。 そして数値を一つずつ取り出して、for文で回して 「0*の0乗」+「0*1乗」+「0*2の2乗」+「1*2の3乗」で10進数の 「8」を取り出したいのですが、全く違った結果が出てしまいます。 結果は 0 0 0 1 0 0 0 1 30000 よろしくご教授お願い致します。

該当のソースコード

Java

1//2進数->10進数 2 3import java.util.Scanner; 4 5class Main{ 6 static void letterAcquisition(String s){ 7 for(int i=s.length()-1; i>=0; i--){ //文字を一つずつ反転させながら取得 8 9 System.out.println(s.charAt(i)); 10 } 11 } 12 static void twoTenBase(String s){ //2進数->10進数変換メソッド 13 14 letterAcquisition(s); 15 int n=Integer.parseInt(s); 16 int sum=0; 17 for(int i=0; i<s.length(); i++){ 18 n=n*2; 19 sum+=n; 20 21 } 22 System.out.print(sum); 23 } 24 public static void main(String[] args){ 25 Scanner sc=new Scanner(System.in); 26 27 String s=sc.next(); 28 letterAcquisition(s); 29 twoTenBase(s); 30 31 } 32}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

結果は
0
0
0
1
0
0
0
1
30000
と出てしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/07 14:39

・2進→10進への変換を、標準ライブラリに頼らずにやってみたいということでしょうか。 ・>全く違った結果が出てしまいます。 ってどんな結果ですか? ・テンプレートでデフォルトで書かれている「ここに記載してください」をちゃんと書き換えてください。
whitehorse85921

2019/08/07 15:01 編集

はい、標準ライブラリに頼らずやってみたいです。 結果は 結果は 0 0 0 1 0 0 0 1 30000 と出ました。 あと書き換えます。
otn

2019/08/07 15:10

> はい、標準ライブラリに頼らずやってみたいです。 は、質問に書いておくべきでしたね。標準ライブラリを使う回答が付いてしまっています。
whitehorse85921

2019/08/07 15:13

otnさん すみません。そうすべきでした。
guest

回答2

0

まず、letterAcquisition(String s) ですが、"文字を一つずつ反転させながら取得" とありますが、反転して一文字ずつ表示しているだけですね。(結果に影響なし)

関数 twoTenBase() ですが、

int n=Integer.parseInt(s);

これでは、s="1010" の時、n=1010 (10進数) で、期待するものでしょうか?

質問にある、

そして数値を一つずつ取り出して、for文で回して

「0*の0乗」+「0*1乗」+「0*2の2乗」+「1*2の3乗」

でも良いですが、"1000"の場合、反転させずに、先頭から、((((1)x2+0)x2+0)x2)+0で十分では?

Java

1int sum=0; 2for(int i=0; i<s.length(); i++){ 3 sum *= 2; 4 sum += Integer.parseInt(s.charAt(i)); 5}

辺りでしょうか。(手元に環境が無いので、未検証)

投稿2019/08/07 15:17

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/08/07 15:20

と書いている内に解決済みになったようですね。
whitehorse85921

2019/08/07 15:37

ありがとうございます! >関数 twoTenBase() ですが、 int n=Integer.parseInt(s); これでは、s="1010" の時、n=1010 (10進数) で、期待するものでしょうか? は、s="1010"を反転させて、"0101"としてから この数値を一つずつ取り出して、ひとずつ2の累乗をして、それを人ずつ足していきたかったのです。 すみません。自分でも頭がこんがらがっててうまく説明できません。
guest

0

ベストアンサー

2進数の文字列を入力して、10進数の値として解釈したいだけならば
読み込んだ文字列をInteger#parseIntする際に基数を指定して

java

1String s = sc.next(); 2int num = Integer.parseInt(s, 2);

とするだけでよさそう。

リファレンス的にはこのあたり
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String-int-

追記

Integer#parseIntを利用しない場合

java

1import java.util.*; 2 3public class Main { 4 5 static int twoTenBase(String s) { 6 int sum = 0; 7 8 // 文字列(数字)の最上位桁から読み取り、基数を掛けていく 9 for (int i = 0; i < s.length(); ++i) { 10 sum *= 2; // 入力が10進数のときはここを10にする(今回は2) 11 sum += s.charAt(i) - '0'; 12 } 13 14 return sum; 15 } 16 17 public static void main(String[] args){ 18 Scanner sc = new Scanner(System.in); 19 20 String s = sc.next(); 21 int result = twoTenBase(s); 22 23 System.out.println(result); 24 } 25}

投稿2019/08/07 14:33

編集2019/08/08 03:48
uskey512

総合スコア144

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whitehorse85921

2019/08/07 15:20

ありがとうございます! 私のコードは自分でもよく分からなかったですが、uskey512さんのコードはとても分かりやすかったです!
swordone

2019/08/07 16:50

Integer.parseIntがString.parseIntになってる
uskey512

2019/08/08 03:48

グワー、修正しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問