【Java】鉄則本_A04_B04
読んでいる本
問題と提出した回答A04
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); String N_binary = Integer.toBinaryString(N); String pre_0 = "";//先頭につける0 //10桁に足りない分だけ0を先頭に付ける for (int i = 0; i < (10 - N_binary.length()); i++) { pre_0 += "0"; } System.out.println(pre_0 + N_binary); } }
取得した数値を2進数の文字列に変換して、10桁に足りない分だけ、文字列の先頭に「0」を付け足す回答をした。
10進数→2進数の変換は、Integerクラスの
toBinaryString(int i)
整数引数の文字列表現を、基数2の符号なし整数として返します。
を使用した。
公式の回答はシフト演算子を使っている。
// 上の桁から順番に「2 進法に変換した値」を求める
for (int x = 9; x >= 0; x--) {
int wari = (1 << x); // 2 の x 乗
System.out.print((N / wari) % 2); // 割り算の結果に応じて 0 または 1 の出力
}
シフト演算子は使用したことがないので、この機会に使い方をマスターしたい。
「1<<x」はxだけ、数値を左にシフトさせるということらしい。
試すとずらした数値を2乗する形になっていた。
System.out.println(1 << 0); //1 1 System.out.println(1 << 1); //2 10 System.out.println(1 << 2); //4 100 System.out.println(1 << 3); //8 1000 System.out.println(1 << 4); //16 10000 System.out.println(1 << 5); //32 100000
ずらす数だけ2乗している(例:1<<3なら2の3乗)。
公式の回答:kyopro-tessoku/codes/java/chap01/answer_A04.java
問題と提出した回答B04
回答1
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String N = String.valueOf(sc.nextInt()); int N_10 = Integer.parseInt(N, 2); System.out.println(N_10); } }
IntegerクラスのparseIntを使った。
parseInt(String s)
文字列の引数を符号付き10進数の整数型として構文解析します。
回答2
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String N = String.valueOf(sc.nextInt()); int N_10 = 0; for (int i = 0 ; i < N.length(); i++) { int tmp = Character.getNumericValue(N.charAt(i)); if (tmp == 0) {//2の0乗は1になるのでスキップさせる continue; } N_10 += Math.pow(2, tmp * (N.length() -1 -i)); } System.out.println(N_10); } }
入力を文字列で受け取り、for文の中で各桁ごとに10進数に変換して足し合わせた。
文字を数値に変換するのはCharacterクラスのgetNumericValueを使用した。
getNumericValue(char ch)
指定されたUnicode文字が表すint値を返します。
この変換作業をしないと、値が「49」になってしまう。下の記事を参考にしました。
TODO
- 他のA,B,C問題を解く
- 本の続きを読む
おわり。。