Java'da bir tamsayının 0-dolgulu ikili gösterimi nasıl elde edilir?


120

örneğin, 1, 2, 128, 256çıktı (16 basamaklı) olabilir:

0000000000000001
0000000000000010
0000000010000000
0000000100000000

denedim

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

sol dolgu için boşluklar koyar:

`               1'

0Dolgu için s nasıl eklenir? Formatter'da bulamadım . Bunu yapmanın başka bir yolu var mı?

Not: Bu gönderi , tamsayıların sol 0-dolguyla nasıl biçimlendirileceğini açıklar, ancak bu ikili gösterim için değildir.


Kullanmayı denedin %016smi
Deniz Doğan

1
@Deniz evet, başarısızException in thread "main" java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0
khachik

Yanıtlar:


198

Bunun yetersiz bir çözüm olduğunu düşünüyorum, ancak

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

1
Evet, şimdi yapıyorum ama başka bir yolu olması gerektiğine inanıyorum :) Teşekkür ederim.
khachik

aslında biraz araştırma yaptıktan sonra, bunu sadece printf sözdizimini kullanarak yapamayacaksın gibi görünüyor .. Yani belki de o kadar da kötü değil.
Samuel Parsonage

@Daniel Negatif sayı boşluk içermeyecek, bu yüzden de işe yarıyor.
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'da yerleşik ikili dönüştürme yoktur, aşağıdaki gibi boşluk karakterini sıfırlarla değiştirmek için String.replace kullanmanızı tavsiye ederim:

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

Veya verilen çizgisinde eklenen sol dolgular yere ile ikilik gösterime dönüştürme tamsayılar için kendi mantığı uygulamak bu So. Veya gerçekten sayıları biçimlendirmek için iletmeniz gerekiyorsa, ikili temsilinizi BigInteger'a dönüştürebilir ve ardından bunu önde gelen sıfırlarla biçimlendirebilirsiniz, ancak bu, aşağıdaki gibi çalışma zamanında çok maliyetlidir:

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

Teşekkürler, bu daha iyidir, çünkü büyük sayıların (örneğin 2 ^ 30) taşmasını önler.
khachik

1
Evet, ama bunu gerçekten yapmazdım, ya değiştirme yöntemini ya da kendi dolgu yöntemimi kullanırdım: bir yol, gerekli dolgu uzunluğunu sıfır bağımsız değişkenle veya kodda biçimlendirmek için String.format'ı tekrar kullanmaktır: String.format ( "% 0" + (32 - binary.length ()) + "d"% s ", 0, binary) tabii ki 32'nin negatif sonuçlarını izlemeniz gerek - binary.length () ...
Zoran Regvart

12

Apache Commons StringUtils'i kullanabilirsiniz . Dizeleri doldurmak için yöntemler sunar:

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

9

Bu işi yapmak için daha önce gerçekten kullanmadığım her türlü yöntem çağrısını deniyordum, orta derecede başarıyla çalıştılar, çok basit bir şey düşünene kadar işe yarayabilirdi ve işe yaradı!

Eminim daha önce düşünülmüştür, uzun ikili kod dizileri için iyi olup olmadığından emin değilim, ancak 16Bit dizgiler için iyi çalışıyor. Umarım yardımcı olur!! (İkinci kod parçasının geliştirildiğine dikkat edin)

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

Will'e, bu cevabın bir döngü ile çalışmasını sağlamak için iyileştirilmesine yardımcı olduğu için teşekkürler. Bu biraz sakar olabilir ama işe yarıyor, lütfen iyileştirin ve eğer yapabiliyorsanız yorum yapın ....

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;

Bu güzel ve basit bir çözüm. binString.length()Bir dize oluşturmak için ve 16 arasındaki farkı kullanarak ve ardından aşağıdaki gibi bir yanıtla olsa da bu dizeyi döngü yapmak yerine binString'e ekleyerek iyileştirilebilir: stackoverflow.com/a/2804866/1353098
olacak

1
Will - harikasın, onu hemen koduma koy! Döngüyü ben de beğenmedim, teşekkür ederim !!!
Tom Spencer

7

İşte eski bir gönderi için yeni bir cevap.

İkili değeri belirli bir uzunluğa sıfırlarla doldurmak için şunu deneyin:

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

Eğer len = 4ve val = 1,

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

dizeyi döndürür "10001", sonra

"10001".substring( 1 )

ilk karakteri atıyor. Böylece istediğimizi elde ederiz:

"0001"

Eğer valnegatif olması muhtemeldir yerine deneyin:

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

5

User3608934'ün "Bu eski bir numara, 16 0'lık bir dize oluşturun ve sonra sahip olduğunuz kırpılmış ikili dizeyi ekleyin" fikrinin daha basit bir versiyonu:

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

4

"Doğru" çözümü bilmiyorum ama size hızlı bir yama önerebilirim.

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

Sadece denedim ve iyi çalıştığını gördüm.


biçimlendirici neden yalnızca 16 karakter genişliğinde? neden olmasın %32s?
yüzük taşıyıcısı

3

Deneyin...

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

Bunu yapmanın "doğru" yolu olduğunu sanmıyorum ... ama işe yarıyor :)


1
Sadece giriş değerleri küçük bir fraksiyonu .... başarıyla üretmek olduğunu olabilir büyük çıkışa kadar çalışır, çünkü bu kesinlikle bunu yapmak için bir fakir yoludur 0000001111111111giriş değeri için 1023bundan daha büyük olan tüm değerler çıktı üretecek toBinaryString(1024)ait 10000000000olan için çok büyük parseInt(...)Bu nedenle, giriş yalnızca 1K 64K olası giriş değerleri için çalışır
rolfl

1

İşe yarayan saf bir çözüm

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

Diğer bir yöntem de

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

Bu, 5 tamsayısının 16 bitlik bir dizisini üretecektir.


1

Java 11'den başlayarak, tekrarlama (...) yöntemini kullanabilirsiniz:

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

Veya herhangi bir tamsayının 32 bit gösterimine ihtiyacınız varsa:

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

0

Bu eski bir numaradır, 16 0'lık bir dize oluşturun ve ardından String.format ("% s", Integer.toBinaryString (1)) 'den aldığınız kırpılmış ikili dizeyi ekleyin ve en sağdaki 16 karakteri kullanarak baştaki herhangi bir numarayı azaltın 0 kullanıcısının. Daha da iyisi, bir ikili dizenin ne kadar uzun olmasını istediğinizi belirtmenize izin veren bir işlev yapın. Tabii ki bunu başarmanın muhtemelen sayısız başka yolu var, kütüphaneler de dahil, ancak bu yazıyı bir arkadaşıma yardımcı olmak için ekliyorum :)

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

Aşağıdaki yöntemle kendi kullanım sınıfımı yazardım

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));
}

}

Çıktı:

5
101
0000000000000000000000000000000000000000000000000000000000000101

Aynı yaklaşım herhangi bir integral tipine uygulanabilir. Maske tipine dikkat edin

long mask = 1L << i;


0

Bu yöntem, bir int'i bir String, length = bit'e dönüştürür. Ya 0'larla doldurulur ya da en önemli bitler kesilir.

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 kullanabilirsiniz . Bir sayıyı kabul eder ve tek dizeli, doldurulmuş ve / veya gruplanmış olarak döndürür.

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()ikili sayıdaki 2 sayısının uzunluğu 01'dir, uzunluk 2 sayısı 4'ü istenen maksimum sayı uzunluğuna değiştirir. Bu, O (n) olarak optimize edilebilir. Continue kullanarak.


0

// Aşağıda uygun boyutlar ele alınacaktır

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
numBve numeşittir ve hiçbir şekilde farklı değildir
igorepst
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.