Podobnie jak w przypadku definiowania stałej liczby całkowitej w formacie szesnastkowym lub ósemkowym, czy mogę to zrobić w postaci binarnej?
Przyznaję, że to naprawdę łatwe (i głupie) pytanie. Moje wyszukiwania w Google są puste.
Podobnie jak w przypadku definiowania stałej liczby całkowitej w formacie szesnastkowym lub ósemkowym, czy mogę to zrobić w postaci binarnej?
Przyznaję, że to naprawdę łatwe (i głupie) pytanie. Moje wyszukiwania w Google są puste.
Odpowiedzi:
Tak więc, wraz z wydaniem Java SE 7, notacja binarna jest standardem po wyjęciu z pudełka. Składnia jest dość prosta i oczywista, jeśli masz przyzwoite zrozumienie binarnego:
byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111;
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;
A konkretnie w kwestii deklarowania zmiennych poziomu klasy jako plików binarnych, nie ma absolutnie żadnego problemu z zainicjowaniem zmiennej statycznej za pomocą notacji binarnej:
public static final int thingy = 0b0101;
Uważaj tylko, aby nie przepełnić liczb zbyt dużą ilością danych, w przeciwnym razie pojawi się błąd kompilatora:
byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte
Teraz, jeśli naprawdę chcesz zaszaleć, możesz połączyć tę inną fajną nową funkcję w Javie 7, znaną jako literały numeryczne z podkreśleniami. Spójrz na te fantazyjne przykłady notacji binarnej z dosłownymi podkreśleniami:
int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;
Czy to nie jest ładne i czyste, nie wspominając o bardzo czytelnym?
Wyciągnąłem te fragmenty kodu z małego artykułu, który napisałem na ten temat na TheServerSide. Zapraszam do sprawdzenia, aby uzyskać więcej informacji:
Java 7 i notacja binarna: opanowanie egzaminu OCP na programistę języka Java (OCPJP)
W Javie 7:
int i = 0b10101010;
W starszych wersjach języka Java nie ma literałów binarnych (alternatywne rozwiązania można znaleźć w innych odpowiedziach).
_
znaki, aby sekwencja była bardziej czytelna: int i = 0b1010_1010_0011;
W Javie nie ma literałów binarnych, ale przypuszczam, że możesz to zrobić (chociaż nie widzę sensu):
int a = Integer.parseInt("10101010", 2);
Odpowiedź od Eda Swangrena
public final static long mask12 =
Long.parseLong("00000000000000000000100000000000", 2);
działa w porządku. Użyłem long
zamiast nich int
i dodałem modyfikatory, aby wyjaśnić możliwe użycie jako maski bitowej. Takie podejście wiąże się jednak z dwiema niedogodnościami.
Mogę zaproponować alternatywne podejście
public final static long mask12 = 1L << 12;
To wyrażenie pokazuje, że dwunasty bit to 1 (licznik zaczyna się od 0, od prawej do lewej); a po najechaniu kursorem myszy na etykietkę
long YourClassName.mask12 = 4096 [0x1000]
pojawia się w Eclipse. Możesz zdefiniować bardziej skomplikowane stałe, takie jak:
public final static long maskForSomething = mask12 | mask3 | mask0;
lub wyraźnie
public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);
Wartość zmiennej maskForSomething
będzie nadal dostępna w Eclipse w czasie projektowania.
Zadeklaruj stałe:
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;
i używaj ich
if( (value & ( FLAG_B | FLAG_D )) != 0){
// value has set FLAG_B and FLAG_D
}
Wyszukaj w Google „Składnia literałów Java”, a otrzymasz kilka wpisów.
Istnieje składnia ósemkowa (prefiks liczby 0), składnia dziesiętna i składnia szesnastkowa z przedrostkiem „0x”. Ale nie ma składni dla notacji binarnej.
Kilka przykładów:
int i = 0xcafe ; // hexadecimal case
int j = 045 ; // octal case
int l = 42 ; // decimal case
byte b = 0b01000001
(dla lepszej czytelności byte b = 0b0100_0001
).
Jeśli chcesz bawić się dużą ilością plików binarnych, możesz zdefiniować kilka stałych:
public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;
itp.
lub
public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;
Nieco bardziej niezręczna odpowiedź:
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() + "\"" );
}
}
która wyprowadza [java] bb powinna wynosić 2, wartość to „2”