web-dev-qa-db-ja.com

javaで整数の0で埋められたバイナリ表現を取得する方法は?

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

0000000000000001
0000000000000010
0000000010000000
0000000100000000

私は試した

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

左詰めのためにスペースを入れます:

`               1'

パディングに0sを配置する方法。 Formatter で見つけることができませんでした。別の方法がありますか?

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

105
khachik

これは次善の解決策だと思いますが、できるかもしれません

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

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

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

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

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

Apache Commons StringUtils を使用できます。文字列を埋め込むためのメソッドを提供します:

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

私はこの仕事をするために実際に使用したことのないあらゆる種類のメソッド呼び出しを試していましたが、彼らは適度な成功を収めました。

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

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

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

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;
8
Tom Spencer

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

バイナリ値に特定の長さまで先行ゼロを埋め込むには、これを試してください:

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 )
6
Cr4paud

試してみてください...

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

私はこれがこれを行うための「正しい」方法だとは思わない...しかしそれは動作します:)

3
Paul

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

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

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

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

試してみたところ、正常に機能することがわかりました。

3
AlexR

動作する素朴なソリューションは

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
proeng

このメソッドは、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
jenfax
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");
    }
  }
}
0
Devesh Kumar

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
Nikmass

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

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
Paul Weiss
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は01であり、長さ2は数値の希望する最大長に4を変更します。これはO(n)に最適化できます。 continueを使用して。

0
Jasmeet Chhabra

私は以下のようなメソッドで独自の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 
 000000000000000000000000000000000000000000000000000000000000101 

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

long mask = 1L << i;

0

これは古いトリックです。16個の0で文字列を作成し、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
user3608934