Java'da ikili biçimde bir tam sayı yazdırma


277

Bir numaram var ve bunu ikili olarak yazdırmak istiyorum. Bir algoritma yazarak bunu yapmak istemiyorum, Java için herhangi bir yerleşik işlevi var mı?

Yanıtlar:


434

"Yerleşik" demek istediğinizi varsayarsak:

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

Tamsayı belgelerine bakın .

( Longbenzer bir yöntemi BigIntegervardır, sayı tabanı belirtebileceğiniz bir örnek yöntemi vardır.)


2
Bu, önde gelen
0'ları

1
@AbuRuqaiyah: OP önde gelen sıfırlardan hiç bahsetmedi ve bir şey için kaç tane beklediklerini bilmemiz gerekecek ...
Jon Skeet

@AbuRuqaiyah Başlıca sıfırlar istiyorsanız, size büyük bir kontrol sağlayan System.out.printf () vardır.
NomadMaker

246

Burada sadece ikili veya başka bir formata bağımlı olmanıza gerek yok ... bir esnek yerleşik fonksiyon mevcuttur Programınızda istediğiniz formatı yazdırır .. Integer.toString (int, temsil);

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

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

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

farklı sayılarla test edin, negatif, pozitif, büyük, küçük
Tertium

8
toBinaryStringikisinin tamamlayıcı çıktısını kullanır toString, belirtilen üssü kapsar ve önüne negatif bir işaret koyar, böylecetoString(-8, 2) == "-1000"
Joe


21

İşleri güzelce basmak ve bitleri her n-bitte ayırmak için bir şeye ihtiyacım vardı. Başka bir deyişle, baştaki sıfırları görüntüler ve şöyle bir şey gösterir:

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

İşte yazdıklarım:

/**
 * 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();
}

Şöyle çağırın:

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

Neden result.replace(result.length() - 1, result.length(), "");gerekli? Biz geçerken intzaten 32 bit olan. İkinci son satırda neleri değiştiriyoruz?
Part

1
@Parth Her adımda dizenin sonuna bir boşluk karakteri ("") ekliyoruz. Bahsettiğiniz satır, son eklenen boşluk karakterinden kurtulacaktır. Esasen, aynı etkiyi elde etmek için Stringsınıfın trimişlevini çağırabilirsiniz .
Maghoumi

Sayıya 0x100000000 ekleyerek, uzun olarak dönüştürerek ve ardından önde gelen 1'i
Lorne Marquis

7

Eski okul:

    int value = 28;
    for(int i = 1, j = 0; i < 256; i = i << 1, j++)
        System.out.println(j + " " + ((value & i) > 0 ? 1 : 0));

Bence System.out.printlnve &inşa edilmiş ins;)
David Williams

1
sadece 3 yıl cevap ... yorum yaptı fark etti.
rajugaadu

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

}

Çıktı:

i: 00000000000000000000000000001101
s: 0000000000001101
b: 00001101

6

Bu mantığın bir sayıyı herhangi bir tabana dönüştürebileceğini kontrol edin

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

VEYA

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 olarak giriş için, `if (a == 0) {binary.append (0); System.out.println (binary.toString ()); dönüş; } `Bu satırı yukarıdaki while çözümüne ikinci çözüme eklememiz gerekiyor.
İmran

4

Bu, bir tamsayının dahili ikili temsilini yazdırmanın en basit yoludur . Örneğin : n'yi 17 olarak alırsak, çıktı: 0000 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

Sadece dene. Kapsam yalnızca belirtilen tam sayı değerinin ikili değerlerini yazdırıyorsa. Olumlu ya da olumsuz olabilir.

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

giriş

5

Çıktı

101


2

32 bit ekran maskesi kullanarak çözüm,

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

Basit ve en kolay çözüm.

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

Bu soru için burada zaten iyi yanıtlar var. Ancak, kendimi denedim (ve en kolay mantık tabanlı → 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

Soru java'da (ve muhtemelen diğer dilde) zor.

Tamsayı 32 bit imzalı bir veri türüdür, ancak Integer.toBinaryString (), tamsayı bağımsız değişkeninin dize olarak temsilini temel 2'de işaretsiz bir tamsayı olarak döndürür .

Bu nedenle, Integer.parseInt (Integer.toBinaryString (X), 2) bir istisna oluşturabilir (imzalı ve imzasız).

Güvenli yol Integer.toString (X, 2) kullanmaktır; bu daha az zarif bir şey üretecektir:

-11110100110

Ama işe yarıyor !!!


Ayrıştırmak değil, yazdırmak istiyor.
Lorne

System.out.println (Integer.toString (X, 2));
ninja

0

Bence şimdiye kadarki en basit algoritma (yerleşik işlevleri kullanmak istemeyenler için):

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

Misal:

convertNumber (1) -> "0b1"

convertNumber (5) -> "0b101"

convertNumber (117) -> "0b1110101"

Nasıl çalışır: while döngüsü, bir sayıyı sağa taşır (son biti ikinci ile son arasında değiştirir, vb.), Son bitin değerini alır ve StringBuilder'a koyar, bit kalmayana kadar tekrarlar (o zaman 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
Cevabınız için çok teşekkürler, ancak lütfen daha fazla açıklama ve / veya bilgi ekleyin ve sorulan sorunu nasıl çözdüğünü öğrenin, böylece diğerleri açıklama istemeden kolayca anlayabilirler :)
koceeng

0

Bu şekilde deneyin:

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

Sol dolgulu sıfırlarla verilen int x'in ikili gösterimi:

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

0

Girdi olarak herhangi bir ondalık sayı girin. Bundan sonra verilen girdiyi ikili sayıya dönüştürmek için modulo ve bölme gibi işlemler yaparız. İşte Tamsayı Değerlerini İkili Dosyaya Dönüştüren Java Programının kaynak kodu ve ondalık sayısı için bu ikilinin bit sayısı. Java programı başarıyla derlendi ve bir Windows sisteminde çalıştırıldı. Program çıktısı aşağıda da gösterilmiştir.

    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

Hiçbir yanıt kabul edilmediğinden, belki de sorunuz bir tam sayının ikili dosyada nasıl saklanacağıyla ilgiliydi. java.io.DataOutputStream aradığınız şey olabilir: 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
çoğu zaman yazdırma, bir dosyada saklamak için konsola bir şeyler yazmak anlamına gelir. Verilerin bir dosyaya serileştirilmesi istendiğinde yanıtınız faydalı olabilir.
Alain-Michel Chomnoue N

Tabii ki, ama asker cevapların hiçbirini kabul etmediği için sorusunun yanlış olduğunu tahmin ettim.
Christian Charbula

0

Bit maskesini (1 << k) kullanabilir ve sayı ile VE işlemini yapabilirsiniz! 1 << k'nin k konumunda bir biti vardır!

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

Güçlü bit manipülasyonu kullanılan imzalı ve imzasız değerlerle çalışır ve soldaki ilk sıfırları oluşturur.

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