Java'da, ikili biçimde bir tamsayı sabiti tanımlayabilir miyim?


86

Onaltılık veya sekizlik olarak bir tamsayı sabitini nasıl tanımlayabildiğinize benzer şekilde, bunu ikili olarak yapabilir miyim?

Bunun gerçekten kolay (ve aptalca) bir soru olduğunu kabul ediyorum. Google aramalarım boş çıkıyor.


2
Bilginize, hemen hemen her programlama dilinde deyim, ikili sabitleri onaltılık olarak yazmaktır, gerçek ikili dizge değil.
abyx

3
Doğru, ama bunun hex var olan en yakın şey olduğu için olduğunu düşünüyorum, ikili ile ilgili bir sorun olduğu için değil. İkili değişmezleri destekleyen kullandığım dillerde, sözleşmenin bu özelliği görmezden gelmek olduğunu düşünmüyorum.
Ken


2017 Yılı: Kabul edilen cevap Russ tarafından sağlanmalıdır. Bakınız: stackoverflow.com/a/1692932/716079
Lourenco

Yanıtlar:


66

Bu nedenle, Java SE 7'nin piyasaya sürülmesiyle birlikte, ikili gösterim standart olarak kutudan çıkar. Sözdizimi oldukça açık ve eğer ikiliyi iyi bir şekilde anlıyorsanız açıktır:

byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111; 
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;

Ve özellikle sınıf düzeyinde değişkenleri ikili olarak bildirme noktasında, ikili gösterimi kullanarak statik bir değişkeni başlatırken kesinlikle hiçbir sorun yoktur:

public static final int thingy = 0b0101;

Sadece çok fazla veriyle sayıları aşmamaya dikkat edin, yoksa bir derleyici hatası alırsınız:

byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte

Şimdi, gerçekten süslü olmak istiyorsanız, Java 7'deki sayısal değişmez değerler olarak bilinen diğer temiz yeni özelliği alt çizgilerle birleştirebilirsiniz. Değişmez alt çizgilerle ikili gösterimlerin bu süslü örneklerine bir göz atın:

int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;

Şimdi o kadar güzel ve temiz değil mi?

Bu kod parçalarını TheServerSide'da konu hakkında yazdığım küçük bir makaleden aldım. Daha fazla ayrıntı için kontrol etmekten çekinmeyin:

Java 7 ve Binary Notation: OCP Java Programmer (OCPJP) Sınavında Ustalaşma


3
Bayt veriniz neden = 0b0000110011; 10 bit var mı? Programlamada yeniyim ancak 8 bitlik bayt veri tipine uyması için 0b00110011 gibi görünmesi gerektiğini düşünüyorum.
Mike

1
Mike ile aynı şeyi merak eden herkes için, bunun nedeni derleyicinin onu temsil ettiği sayıya dönüştürmesidir - baştaki onlarca sıfır olabilir ve bunlar gerçek değeri etkilemez. Derleme süreci esasen orada bir ondalık yazmışsınız gibi aynıdır.
Luke Briggs

1
tanıma göre ilkel tür bayt, -128 ila 127 (-128 ila -1 ve 0 ila 127) arasında 256 sayı saklayabilir. Fakat -128'in bir ikili değişmez kullanarak nasıl temsil edileceği. örneğin bayt için b = -0b1111111; -127'yi gösterir, peki ya -128?
nirmalsingh

152

Java 7'de:

int i = 0b10101010;

Java'nın eski sürümlerinde ikili değişmez bilgi yoktur (alternatifler için diğer yanıtlara bakın).


33
Ayrıca _, diziyi daha okunaklı hale getirecek karakterler olabileceğini de int i = 0b1010_1010_0011;
belirtmek isterim

@Russ 0b burada ne anlama geliyor? Java 7'de bu özelliğin adı nedir?
Geek

1
0b ikili anlamına gelir. Bu özelliğe ikili değişmezler denir: docs.oracle.com/javase/7/docs/technotes/guides/language/…
Russ Hayward

1
İkili verilerin bu yeni temsilini seviyorum. String temsilini okumak çok zor olurdu. Kabul edilen cevap ile "@ user12345613" arasındaki farka bakın. Onun için +1.
Marcello de Sales

54

Java'da ikili literal yoktur, ancak bunu yapabileceğinizi sanıyorum (asıl noktayı görmeme rağmen):

int a = Integer.parseInt("10101010", 2);

1
Diğer kullanımların yanı sıra, çizgi ve çokgen rasterleştirme için noktalama deseni, birkaç popüler grafik kütüphanesinde bir tamsayı olarak belirtilir. ParseInt veya parseShort kullanmak, geliştiricinin deseni kolayca görselleştirmesine olanak tanır.
charstar

5
Java 7'den beri Russ Hayward'ın cevabı doğru cevaptır. Java 7'den önce, ikiliyi eski Java sürümleri tarafından tanınan gösterimlerden birine (sekizlik, ondalık veya onaltılık) dönüştürmek için çevrimiçi bir araç veya en sevdiğiniz hesap makinesini kullanabilirsiniz. Başka bir taban kullanılırsa, okuyucular için değeri açıklığa kavuşturmak için bildirime ikili gösterimi içeren açıklayıcı bir yorum yerleştirilebilir.
Jason C

Bu oldukça kirli bir çözüm, değil mi? 1 baytı temsil etmek için sadece 16 bayt alıyorsunuz (ikinci bağımsız değişkeni ve dönüşümü saymazsınız). Elbette, derleyici bunu optimize etmedikçe, ki şüpheliyim.
Tomáš Zato - Monica'yı eski durumuna getir

@ TomášZato: Evet, öyle, ama bu cevabı yazarken dilin ikili harfleri desteklemediği göz önüne alındığında hangi çözümü önerirsiniz? Russ Hayward, kabul edilen cevaba şimdi sahip olmalı.
Ed S.

Konfordan vazgeçip tamsayılar kullanmanızı öneririm. Değişken tanımının kendisinde sorun yok, ancak bu cevap kullanıcıları bu yaklaşımı döngüler vb. İçin kullanmaya motive edebilir. Ve genel olarak, programcının bir miktar performans için kendi rahatlığından vazgeçmesi gerektiğini düşünüyorum.
Tomáš Zato - Monica'yı eski durumuna getir

18

Ed Swangren'den cevap

public final static long mask12 = 
  Long.parseLong("00000000000000000000100000000000", 2);

iyi çalışıyor. Bunun longyerine, intbit maskesi olarak olası kullanımı netleştirmek için değiştiricileri kullandım ve ekledim. Yine de bu yaklaşımın iki sakıncası vardır.

  1. Tüm bu sıfırların doğrudan yazılması hataya meyillidir
  2. Sonuç, geliştirme sırasında ondalık veya onaltılık biçimde mevcut değildir

Alternatif yaklaşım önerebilirim

public final static long mask12 = 1L << 12;

Bu ifade, 12. bitin 1 olduğunu açıkça gösterir (sayım 0'dan sağdan sola başlar); ve fare imlecinin üzerine geldiğinizde, araç ipucu

long YourClassName.mask12 = 4096 [0x1000]

Eclipse'de görünür. Daha karmaşık sabitleri şöyle tanımlayabilirsiniz:

public final static long maskForSomething = mask12 | mask3 | mask0;

veya açıkça

public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);

Değişkenin değeri maskForSomething, geliştirme sırasında Eclipse'de hala mevcut olacaktır.


Mükemmel çözüm! (public final static long mask12 = 1L << 12;)
Jyro117

17

Maskelemek için ikili sabitleri kullanma

Sabitleri bildirin:

public static final int FLAG_A = 1 << 0;
public static final int FLAG_B = 1 << 1;
public static final int FLAG_C = 1 << 2;
public static final int FLAG_D = 1 << 3;

ve onları kullan

if( (value & ( FLAG_B | FLAG_D )) != 0){
    // value has set FLAG_B and FLAG_D
}

12

Google'da "Java değişmezleri sözdizimi" ni arayın ve bazı girişler bulun.

Sekizlik bir sözdizimi (numaranızın önüne 0 gelir), ondalık sözdizimi ve "0x" ön ekiyle onaltılık sözdizimi vardır. Ancak ikili gösterim için sözdizimi yok.

Bazı örnekler:

int i = 0xcafe ; // hexadecimal case
int j = 045 ;    // octal case
int l = 42 ;     // decimal case

1
Bu soruya cevap vermiyor.
Michael McQuade

2017 Yılı: Neyse ki ikili temsil için gösterim var. "0b" ile başlar. Örnek: byte b = 0b01000001(daha iyi okuma için byte b = 0b0100_0001).
Lourenco

2

Çok sayıda ikili dosya ile uğraşmak istiyorsanız, bazı sabitler tanımlayabilirsiniz:

public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;

vb.

veya

public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;

0

Biraz daha garip cevap:

public class Main {

    public static void main(String[] args) {
        byte b = Byte.parseByte("10", 2);
        Byte bb = new Byte(b);
        System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" );
    }

}

hangi çıktı [java] bb 2 olmalı, değer "2"

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.