Javaで整数をバイナリ形式で出力する


276

番号があり、バイナリで印刷したい。アルゴリズムを記述してそれを実行したくないのですが、Javaの組み込み関数はありますか?

回答:


433

「組み込み」を意味すると仮定します。

int x = 100;
System.out.println(Integer.toBinaryString(x));

整数のドキュメントを参照してください。

Long同様のメソッドBigIntegerがあり、基数を指定できるインスタンスメソッドがあります。)


2
これは先頭の0を
省略します

1
@AbuRuqaiyah:OPは先行ゼロについて言及しなかったため、1つの事柄に何が期待されるかを知る必要があります...
Jon Skeet 2017

@AbuRuqaiyah先行ゼロが必要な場合は、高度な制御が可能なSystem.out.printf()があります。
NomadMaker

246

ここでは、バイナリまたは他の形式だけに依存する必要はありません... 1つの柔軟な組み込み関数が使用可能です。プログラムで必要な形式を出力します。Integer.toString(int、representation);

Integer.toString(100,8) // prints 144 --octal representation

Integer.toString(100,2) // prints 1100100 --binary representation

Integer.toString(100,16) //prints 64 --Hex representation

さまざまな数値、負、正、大、小でテストする
Tertium

8
toBinaryString用途2の補数出力は、toStringそう、指定したベースとプット前に負の符号を数隠れ家toString(-8, 2) == "-1000"
ジョー


21

物事をきれいに印刷し、ビットをnビットごとに分離するための何かが必要でした。つまり、先行ゼロを表示し、次のように表示します。

n = 5463
output = 0000 0000 0000 0000 0001 0101 0101 0111

だからここに私が書いたものがあります:

/**
 * Converts an integer to a 32-bit binary string
 * @param number
 *      The number to convert
 * @param groupSize
 *      The number of bits in a group
 * @return
 *      The 32-bit long bit string
 */
public static String intToString(int number, int groupSize) {
    StringBuilder result = new StringBuilder();

    for(int i = 31; i >= 0 ; i--) {
        int mask = 1 << i;
        result.append((number & mask) != 0 ? "1" : "0");

        if (i % groupSize == 0)
            result.append(" ");
    }
    result.replace(result.length() - 1, result.length(), "");

    return result.toString();
}

次のように呼び出します。

public static void main(String[] args) {
    System.out.println(intToString(5463, 4));
}

なぜresult.replace(result.length() - 1, result.length(), "");必要なのですか?私たちが渡しintているのは、すでに32ビットです。最後の2行目で何を置き換えますか?
パート

1
@Parth各ステップで、文字列の最後にスペース文字( "")を追加します。あなたが言及した行は、最後に追加されたスペース文字を取り除きます。基本的に、同じ効果を得るためにStringクラスのtrim関数を呼び出すことができます。
Maghoumi 2015年

あなたは、数に0x100000000を追加する限り、それを変換して、主要な1を破棄することにより、より多くの簡単かつ効率的にこれを行うことができます
ローン侯爵


7
public static void main(String[] args) 
{
    int i = 13;
    short s = 13;
    byte b = 13;

    System.out.println("i: " + String.format("%32s", 
            Integer.toBinaryString(i)).replaceAll(" ", "0"));

    System.out.println("s: " + String.format("%16s", 
            Integer.toBinaryString(0xFFFF & s)).replaceAll(" ", "0"));

    System.out.println("b: " + String.format("%8s", 
            Integer.toBinaryString(0xFF & b)).replaceAll(" ", "0"));

}

出力:

i: 00000000000000000000000000001101
s: 0000000000001101
b: 00001101

6

このロジックをチェックして、数値を任意の基数に変換できます

public static void toBase(int number, int base) {
    String binary = "";
    int temp = number/2+1;
    for (int j = 0; j < temp ; j++) {
        try {
            binary += "" + number % base;

            number /= base;
        } catch (Exception e) {
        }
    }
    for (int j = binary.length() - 1; j >= 0; j--) {
        System.out.print(binary.charAt(j));
    }
}

または

StringBuilder binary = new StringBuilder();
int n=15;
while (n>0) {
    if((n&1)==1){
        binary.append(1);
    }else
        binary.append(0);
    n>>=1;
}
System.out.println(binary.reverse());

1
入力が0の場合、 `if(a == 0){binary.append(0); System.out.println(binary.toString()); 戻る; 上記のwhileループの2番目のソリューションでこの行を追加する必要があります。
Imran

4

これは、整数の内部バイナリ表現を出力する最も簡単な方法です。 :nを17とすると、出力は0000 0000 0000 0000 0000 0000 0001 0001

void bitPattern(int n) {

        int mask = 1 << 31;
        int count = 0;
        while(mask != 0) {
            if(count%4 == 0)
                System.out.print(" ");

            if((mask&n) == 0) 

                System.out.print("0");



            else 
                System.out.print("1");


            count++;
            mask = mask >>> 1;


    }
    System.out.println();
}

4

ぜひお試しください。スコープが指定された整数値のバイナリ値のみを出力する場合。正または負にすることができます。

      public static void printBinaryNumbers(int n) {
        char[] arr = Integer.toBinaryString(n).toCharArray();
        StringBuilder sb = new StringBuilder();
        for (Character c : arr) {
          sb.append(c);
        }
        System.out.println(sb);
      }

入力

5

出力

101


2

32ビットディスプレイマスクを使用したソリューション

public static String toBinaryString(int n){

    StringBuilder res=new StringBuilder();
    //res= Integer.toBinaryString(n); or
    int displayMask=1<<31;
    for (int i=1;i<=32;i++){
        res.append((n & displayMask)==0?'0':'1');
        n=n<<1;
        if (i%8==0) res.append(' ');
    }

    return res.toString();
}


 System.out.println(BitUtil.toBinaryString(30));


O/P:
00000000 00000000 00000000 00011110 

2

シンプルでかなり簡単なソリューション。

public static String intToBinaryString(int integer, int numberOfBits) {

    if (numberOfBits > 0) {     // To prevent FormatFlagsConversionMismatchException.

        String nBits = String.format("%" + numberOfBits + "s",      // Int to bits conversion
                Integer.toBinaryString(integer))
                .replaceAll(" ","0"); 

        return nBits;   // returning the Bits for the given int.
    }

    return null;        // if the numberOfBits is not greater than 0, returning null.
}

1

この質問には、すでに良い回答が投稿されています。しかし、これは私が自分で試した方法です(そして、最も簡単なロジックベース→ modulo / divide / addかもしれません):

        int decimalOrBinary = 345;
        StringBuilder builder = new StringBuilder();

        do {
            builder.append(decimalOrBinary % 2);
            decimalOrBinary = decimalOrBinary / 2;
        } while (decimalOrBinary > 0);

        System.out.println(builder.reverse().toString()); //prints 101011001

0

質問はJavaでは(そしておそらく他の言語でも)トリッキーです。

Integerは32ビットの符号付きデータ型ですが、Integer.toBinaryString()は整数引数の文字列表現を、基数2の符号なし整数として返します。

そのため、Integer.parseInt(Integer.toBinaryString(X)、2)は例外を生成する可能性があります(符号付きまたは符号なし)。

安全な方法は、Integer.toString(X、2);を使用することです。これにより、エレガントさが低下します。

-11110100110

しかし、うまくいきます!!!


彼はそれを解析するのではなく、印刷したいのです。
ローンの侯爵

System.out.println(Integer.toString(X、2));
忍者

0

私はこれがこれまでで最も単純なアルゴリズムだと思います(組み込み関数を使用したくない人のために):

public static String convertNumber(int a)  { 
              StringBuilder sb=new StringBuilder();
              sb.append(a & 1);
              while ((a>>=1) != 0)  { 
                  sb.append(a & 1);
               }
              sb.append("b0");
              return sb.reverse().toString();
  }

例:

convertNumber(1) -> "0b1"

convertNumber(5) -> "0b101"

convertNumber(117) -> "0b1110101"

仕組み: whileループはaの数値を右に移動し(最後のビットを最後から2番目のビットに置き換えるなど)、最後のビットの値を取得してStringBuilderに入れ、ビットがなくなるまで繰り返します(つまり、 a = 0)。


0
    for(int i = 1; i <= 256; i++)
    {
        System.out.print(i + " "); //show integer
        System.out.println(Integer.toBinaryString(i) + " "); //show binary
        System.out.print(Integer.toOctalString(i) + " "); //show octal
        System.out.print(Integer.toHexString(i) + " "); //show hex

    }

3
回答に感謝します。ただし、説明や情報を追加し、質問がどのように解決されるかを明記してください。明確化を求めずに他の人が簡単に理解できるようにします:)
koceeng

0

この方法を試してください:

public class Bin {
  public static void main(String[] args) {
    System.out.println(toBinary(0x94, 8));
  }

  public static String toBinary(int a, int bits) {
    if (--bits > 0)
        return toBinary(a>>1, bits)+((a&0x1)==0?"0":"1");
    else 
        return (a&0x1)==0?"0":"1";
  }

}

10010100


0

左側にゼロが埋め込まれた指定されたint xのバイナリ表現:

org.apache.commons.lang3.StringUtils.leftPad(Integer.toBinaryString(x), 32, '0')

0

10進数を入力として入力します。その後、与えられた入力を2進数に変換するためのモジュロや除算などの操作を行います。これは、整数値をバイナリに変換するJavaプログラムのソースコードと、このバイナリの10進数のビット数です。Javaプログラムが正常にコンパイルされ、Windowsシステムで実行されます。プログラムの出力も以下に示します。

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int integer ;
        String binary = "";    //   here we count "" or null 
                               //   just String binary = null;
        System.out.print("Enter the binary Number: ");
        integer = sc.nextInt();

        while(integer>0)
        {
            int x = integer % 2;
            binary = x + binary;
            integer = integer / 2;  
        }
        System.out.println("Your binary number is : "+binary);
        System.out.println("your binary length : " + binary.length());
    }
}

0

答えは受け入れられないので、おそらくバイナリファイルに整数を格納する方法についての質問でした。java.io.DataOutputStreamはあなたが探しているものかもしれません:https : //docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html

DataOutputStream os = new DataOutputStream(outputStream);
os.writeInt(42);
os.flush();
os.close();

2
ほとんどの場合、印刷とは、ファイルに保存するのではなく、コンソールに何かを書き込むことを意味します。データをファイルにシリアル化するように求められた場合、答えは役に立ちます。
Alain-Michel Chomnoue N

もちろん、しかし、質問者が答えを受け入れていないので、彼の質問は不正確だったと思いました。
クリスチャンチャブラ

0

ビットマスク(1 << k)を使用して、数値とのAND演算を実行できます。1 << kはkの位置に1ビットを持っています!

private void printBits(int x) {
    for(int i = 31; i >= 0; i--) {
        if((x & (1 << i)) != 0){
            System.out.print(1);
        }else {
            System.out.print(0);
        }
    }
    System.out.println();
}

-2

強力なビット操作を使用した符号付きおよび符号なしの値で機能し、左側に最初のゼロを生成します。

public static String representDigits(int num) {

        int checkBit = 1 << (Integer.SIZE * 8 - 2 );    // avoid the first digit        
        StringBuffer sb = new StringBuffer();

        if (num < 0 ) {     // checking the first digit
            sb.append("1");
        } else {
            sb.append("0");
        }

        while(checkBit != 0) {          
            if ((num & checkBit) == checkBit){
                sb.append("1");
            } else {
                sb.append("0");
            }           
            checkBit >>= 1;     
        }       

        return sb.toString();
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.