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

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

ただいまの
回答率

88.92%

java 2進数変換

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 305

mikan22222

score 4

問題

0〜65535の整数値を入力させ、入力値を16桁の2進数に変換して表示するプログラムを作成せよ。

書いたコード

    private static void question56() {

        final int i = 127;
        final String bin = Integer.toBinaryString(i);

        System.out.println(String.format("%016d", i));
    }

出力したい答え

0000000001111111

javaを勉強中で、問題を解いていたところ
2進数に変換後、0埋めをして出力させようと思ったのですが、
引数型 'String' は書式指定子 '%016d' の型と一致しません 
とエラーがでてしまい、詰まってしまいました。

そもそもやり方が間違っているのか、アドバイスよければお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2020/07/16 20:27

    エラーとコードが合ってません

    キャンセル

回答 6

checkベストアンサー

0

class Test {
    public static void main(String[] args) {
        System.out.println(bin16(127));
    }

    static String bin16(int n) {
        String s = Integer.toBinaryString(n);
        return String.format("%0"+(16-s.length())+"d%s", 0, s); 
    }
}


追記
別解

class Test {
    static String bin16(int n) {
        String s = "000000000000000" + Integer.toBinaryString(n);
        return s.substring(s.length() - 16);
    }

    public static void main(String[] args) {
        System.out.println(bin16(127));
    }
}


追記2
さらに別解

class Test {
    static String bin16(int n) {
        String s = "";
        for (int i = 16; i > 0; s += "01".charAt(n >> --i & 1)) ;
        return s;
    }
    public static void main(String[] args) {
        System.out.println(bin16(127));
    }
}


for (int i = 16; i > 0; s += (char)('0'+(n >> --i & 1))) ; の方が
メソッド charAt の呼び出しが無くて速いかも。でも += は遅いでしょう。

追記3
これが一番簡単かな?

class Test {
    static String bin16(int n) {
        return Integer.toBinaryString(0x10000 + n).substring(1);
    }

    public static void main(String[] args) {
        System.out.println(bin16(127));
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/19 11:15

    最初のやつ「0XF000」以上のいれると

    Exception in thread "main" java.util.DuplicateFormatFlagsException: Flags = '0'

    なるよな・q・

    += が遅いなら char[16] に放り込んで最後に new String すると結合コストがないはず

    キャンセル

  • 2020/07/19 14:45

    最初のやつ「0x8000」以上のを値を入れるとですね。バグです。すみません。
    char[16] なら確かにコストが少ないですが、for文で 16回まわすのはやはり遅いでしょう。

    キャンセル

  • 2020/07/21 16:19

    別解色々とありがとうございます!参考になりました!

    キャンセル

0

思い付きだけなんで、もっとうまい方法が有ると思う。

    public static void main(String[] args) {
        int s = 127;
        String str = "";
        for (int i = 15; i >= 0; i--) {
            if ((s & (1 << i)) != 0) {
                str += '1';
            } else {
                str += '0';
            }
        }
        System.out.println(str);
    }


0000000001111111

Process finished with exit code 0

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/16 20:29

    Integer.toBinaryString()だと、頭の0は出力されません。また、書式の"%016d"はデシマル(10進)表示です。

    キャンセル

  • 2020/07/21 16:20

    ありがとうございます!10進なのですね勘違いしてました勉強になります;;

    キャンセル

0

"%16s"で16文字のstringを先頭スペース埋めで出力できるので、その後スペースを0に置き換え。

        int i = 127;
        String bin = Integer.toBinaryString(i);

        System.out.println(String.format("%16s", bin).replace(' ', '0'));


参考 https://qiita.com/Qui/items/2773bdce647cf987d5d4

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/21 16:19

    ありがとうございます!

    キャンセル

0

  public static void main(String[] args) {
    for (int i=0;i<=0xffff;++i) System.out.println(binaryString(i));
  }
  static String binaryString(final int val) {
    return IntStream.iterate(15, x -> x-1).limit(16)
                    .mapToObj(x -> ((val & (int)Math.pow(2,x)) == 0) ? "0" : "1")
                    .collect(Collectors.joining());
  }

少し変えました。

  static String binaryString(final int val) {
    return IntStream.iterate(15, x -> x - 1).limit(16)
                    .mapToObj(x -> String.valueOf((val >> x) & 1))
                    .collect(Collectors.joining());
  }

再帰型。

  static String binaryString(int val) {
    return binaryString(int val, "");
  }
  static String binaryString(int val, String acc) {
    if (acc.length() == 16) {
      return acc;
    } else {
      return binaryString(val >> 1, String.valueOf(val & 1) + acc);
    }
  }

いくらでも遊べそうな雰囲気。他の言語でやってみることをお勧めします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/18 22:45

    よく見たらcateyeさんの回答とほぼ同じだった。

    キャンセル

  • 2020/07/21 16:18

    ありがとうございます!慣れてきたら他の言語でも書いてみようと思います!

    キャンセル

0

String bin = Integer.toBinaryString(127);
System.out.println(String.format("%16s", bin).replaceAll(" ", "0"));

大喜利状態になりつつあるけど・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/18 23:04

    みのがしてダブってる・・・

    キャンセル

  • 2020/07/21 16:18

    ありがとうございます!

    キャンセル

0

public class binbin {
  public static void main(String[] args) {
    for (int i = 0; i <= 0xffff; i++)
      System.out.printf("%016d\n", Long.parseLong(Integer.toBinaryString(i)));
  }
}

あん2

import java.math.BigDecimal;
public class binbin2 {
  public static void main(String[] args) {
    final int limit = 65535;
    final BigDecimal template = new BigDecimal(Integer.toBinaryString(limit + 1));
    for (int i = 0; i <= limit; i++)
      System.out.println((template.add(new BigDecimal(Integer.toBinaryString(i)))).toString().substring(1));
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/21 16:17

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

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る