Javaで整数のゼロ詰めバイナリ表現を取得するにはどうすればよいですか?


120

たとえば、1, 2, 128, 256出力は(16桁)の場合があります。

0000000000000001
0000000000000010
0000000010000000
0000000100000000

私は試した

String.format("%16s", Integer.toBinaryString(1));

それは左パディングのためのスペースを置きます:

`               1'

0パディングのためのsの配置方法。Formatterで見つかりませんでした。それを行う別の方法はありますか?

PS この投稿では、左0-パディングを使用して整数をフォーマットする方法について説明していますが、バイナリ表現ではありません。


使ってみました%016sか?
Deniz Dogan

1
@Denizはい、失敗しますException in thread "main" java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0
khachik

これを見てください:stackoverflow.com/a/15124135/1316649
fstang 2014年

回答:


198

これは次善の解決策だと思いますが、あなたはそうすることができます

String.format("%16s", Integer.toBinaryString(1)).replace(' ', '0')

1
はい、今やりますが、別の方法があるはずだと思います:)ありがとう。
khachik

実際に調査を行った後、printf構文を使用するだけではそれを実行できないように見えます。ですから、おそらくそれほど悪くはないでしょう。
Samuel Parsonage 2010

@Daniel負の数にはスペースが含まれないため、機能します。
Eric Wang

@Daniel Integer :: toBinaryString doc:Returns a string representation of the integer argument as an unsigned integer in base 2.
Alan

17

java.util.Formatterに組み込まれているバイナリ変換はありません。次のように、String.replaceを使用してスペース文字をゼロに置き換えることをお勧めします。

String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")

または、独自のロジックを実装して、整数を2進数表現に変換し、この行に沿ってどこかに左パディングを追加します。または、数値をフォーマットに渡す必要がある場合は、バイナリ表現をBigIntegerに変換してから、先行ゼロでフォーマットすることができますが、これは実行時に非常にコストがかかります。

String.format("%016d", new BigInteger(Integer.toBinaryString(1)))

おかげで、これは大きい数(例:2 ^ 30)でのオーバーフローを回避するため、より優れています。
khachik

1
はい、しかし私は本当にそれをしません、私はreplaceメソッドまたは独自のパディングメソッドを使用します:1つの方法は、String.formatを再度使用して、必要なパディング長を引数ゼロでフォーマットするか、コードで:String.format( "%0" +(32-binary.length())+ "d"%s "、0、binary)もちろん、32-binary.length()...の否定的な結果を監視する必要があります
Zoran Regvart

12

Apache Commons StringUtilsを使用できます。文字列をパディングするためのメソッドを提供します:

StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');

9

この作業を行うためにこれまで実際に使用したことのないあらゆる種類のメソッド呼び出しを試しましたが、非常に単純なものでうまくいくかもしれないと思うまで、それらは中程度の成功を収めました。

私はそれが以前に考えられていたと確信しています、それがバイナリコードの長い文字列に何か良いかどうかはわかりませんが、16Bit文字列ではうまく機能します。それが役に立てば幸い!!(2番目のコードが改善されていることに注意してください)

String binString = Integer.toBinaryString(256);
  while (binString.length() < 16) {    //pad with 16 0's
        binString = "0" + binString;
  }

ループなしで動作するようにこの回答を改善するのを手伝ってくれたウィルに感謝します。これは少し不器用かもしれませんが、動作します。改善できる場合はコメントしてください。

binString = Integer.toBinaryString(256);
int length = 16 - binString.length();
char[] padArray = new char[length];
Arrays.fill(padArray, '0');
String padString = new String(padArray);
binString = padString + binString;

これは、素晴らしくてシンプルなソリューションです。それは間の差を利用して改善することができるbinString.length()けれども、この答えのようなもので、文字列を作成し、16、その後binStringにその文字列を追加するのではなくループ:stackoverflow.com/a/2804866/1353098
ウィルを

1
意志-あなたは素晴らしいです、今それを私のコードに入れてください!ループも好きじゃなかった、ありがとう!!!
トムスペンサー

7

ここに古い投稿に対する新しい答えがあります。

バイナリ値に先行ゼロを埋め込んで特定の長さにするには、次のことを試してください。

Integer.toBinaryString( (1 << len) | val ).substring( 1 )

もしlen = 4およびval = 1

Integer.toBinaryString( (1 << len) | val )

文字列を返し"10001"、その後、

"10001".substring( 1 )

最初の文字を破棄します。したがって、必要なものを取得します。

"0001"

val否定的である可能性が高い場合は、次のことを試してください。

Integer.toBinaryString( (1 << len) | (val & ((1 << len) - 1)) ).substring( 1 )

5

user3608934のアイデアのより単純なバージョン「これは古いトリックです。16の0で文字列を作成し、取得したトリミングされたバイナリ文字列を追加します」:

private String toBinaryString32(int i) {
    String binaryWithOutLeading0 = Integer.toBinaryString(i);
    return "00000000000000000000000000000000"
            .substring(binaryWithOutLeading0.length())
            + binaryWithOutLeading0;
}

4

「正しい」解決策はわかりませんが、迅速なパッチを提案できます。

String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0");

私はそれを試したところ、それがうまく機能することがわかりました。


フォーマッタの幅が16文字しかないのはなぜですか?なんで%32s
リングベアラー

3

やってみて...

String.format("%016d\n", Integer.parseInt(Integer.toBinaryString(256)));

私はこれがこれを行う「正しい」方法だとは思わない...しかしそれはうまくいく:)


1
それが唯一の入力値のごく一部....それが成功した生産がされてできる最大出力まで動作しますので、これは確かにそれを行うには貧弱な方法で0000001111111111入力値のための1023より大きな任意の値から出力を生成しますtoBinaryString(1024)10000000000ですparseInt(...)したがって、入力に対して大きすぎるため、入力は64Kの可能な入力値の1Kに対してのみ機能します
rolfl

1

働く素朴な解決策は

String temp = Integer.toBinaryString(5);
while (temp.length() < Integer.SIZE) temp = "0"+temp; //pad leading zeros
temp = temp.substring(Integer.SIZE - Short.SIZE); //remove excess

他の1つの方法は

String temp = Integer.toBinaryString((m | 0x80000000));
temp = temp.substring(Integer.SIZE - Short.SIZE);

これは整数5の16ビット文字列を生成します


1

Java 11以降では、repeat(...)メソッドを使用できます。

"0".repeat(Integer.numberOfLeadingZeros(i) - 16) + Integer.toBinaryString(i)

または、整数の32ビット表現が必要な場合:

"0".repeat(Integer.numberOfLeadingZeros(i != 0 ? i : 1)) + Integer.toBinaryString(i)

0

これは古いトリックで、0が16の文字列を作成してから、String.format( "%s"、Integer.toBinaryString(1))から取得したトリミングされたバイナリ文字列を追加し、右端の16文​​字を使用して、先頭を省略します0です。さらに良いことに、バイナリ文字列の長さを指定できる関数を作成します。もちろん、ライブラリを含めてこれを実現する方法は他にもありますが、友人を助けるためにこの投稿を追加しています:)

public class BinaryPrinter {

    public static void main(String[] args) {
        System.out.format("%d in binary is %s\n", 1, binaryString(1, 4));
        System.out.format("%d in binary is %s\n", 128, binaryString(128, 8));
        System.out.format("%d in binary is %s\n", 256, binaryString(256, 16));
    }

    public static String binaryString( final int number, final int binaryDigits ) {
        final String pattern = String.format( "%%0%dd", binaryDigits );
        final String padding = String.format( pattern, 0 );
        final String response = String.format( "%s%s", padding, Integer.toBinaryString(number) );

        System.out.format( "\npattern = '%s'\npadding = '%s'\nresponse = '%s'\n\n", pattern, padding, response );

        return response.substring( response.length() - binaryDigits );
    }
}

0

私は以下のようなメソッドで自分のutilクラスを書きます

public class NumberFormatUtils {

public static String longToBinString(long val) {
    char[] buffer = new char[64];
    Arrays.fill(buffer, '0');
    for (int i = 0; i < 64; ++i) {
        long mask = 1L << i;
        if ((val & mask) == mask) {
            buffer[63 - i] = '1';
        }
    }
    return new String(buffer);
}

public static void main(String... args) {
    long value = 0b0000000000000000000000000000000000000000000000000000000000000101L;
    System.out.println(value);
    System.out.println(Long.toBinaryString(value));
    System.out.println(NumberFormatUtils.longToBinString(value));
}

}

出力:

5
101
0000000000000000000000000000000000000000000000000000000000000101

同じアプローチを任意の整数型に適用できます。マスクの種類に注意してください

long mask = 1L << i;


0

このメソッドは、intを長さ=ビットの文字列に変換します。0が埋め込まれるか、最上位ビットが切り捨てられます。

static String toBitString( int x, int bits ){
    String bitString = Integer.toBinaryString(x);
    int size = bitString.length();
    StringBuilder sb = new StringBuilder( bits );
    if( bits > size ){
        for( int i=0; i<bits-size; i++ )
            sb.append('0');
        sb.append( bitString );
    }else
        sb = sb.append( bitString.substring(size-bits, size) );

    return sb.toString();
}

0

lib https://github.com/kssource/BitSequenceを使用できます。数値を受け入れ、パディングまたはグループ化されたバイナリ文字列を返します。

String s = new BitSequence(2, 16).toBynaryString(ALIGN.RIGHT, GROUP.CONTINOUSLY));  
return  
0000000000000010  

another examples:

[10, -20, 30]->00001010 11101100 00011110
i=-10->00000000000000000000000000001010
bi=10->1010
sh=10->00 0000 0000 1010
l=10->00000001 010
by=-10->1010
i=-10->bc->11111111 11111111 11111111 11110110

0
for(int i=0;i<n;i++)
{
  for(int j=str[i].length();j<4;j++)
  str[i]="0".concat(str[i]);
}

str[i].length()数値の長さ2は2進数で2は01で、長さ2は4を数値の必要な最大長に変更します。これはO(n)に最適化できます。continueを使用して。


0

//以下は適切なサイズを処理します

public static String binaryString(int i) {
    return String.format("%" + Integer.SIZE + "s", Integer.toBinaryString(i)).replace(' ', '0');
}

public static String binaryString(long i) {
    return String.format("%" + Long.SIZE + "s", Long.toBinaryString(i)).replace(' ', '0');
}

0
import java.util.Scanner;
public class Q3{
  public static void main(String[] args) {
    Scanner scn=new Scanner(System.in);
    System.out.println("Enter a number:");
    int num=scn.nextInt();
    int numB=Integer.parseInt(Integer.toBinaryString(num));
    String strB=String.format("%08d",numB);//makes a 8 character code
    if(num>=1 && num<=255){
     System.out.println(strB);
    }else{
        System.out.println("Number should be in range between 1 and 255");
    }
  }
}

1
numBそして、num等しく、いかなる方法でも異なっていない
igorepst
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.