Tương tự như cách bạn có thể xác định một hằng số nguyên trong hệ thập lục phân hoặc bát phân, tôi có thể làm điều đó trong hệ nhị phân không?
Tôi thừa nhận đây là một câu hỏi thực sự dễ (và ngu ngốc). Các tìm kiếm trên google của tôi đang trống.
Tương tự như cách bạn có thể xác định một hằng số nguyên trong hệ thập lục phân hoặc bát phân, tôi có thể làm điều đó trong hệ nhị phân không?
Tôi thừa nhận đây là một câu hỏi thực sự dễ (và ngu ngốc). Các tìm kiếm trên google của tôi đang trống.
Câu trả lời:
Vì vậy, với việc phát hành Java SE 7, ký hiệu nhị phân trở thành tiêu chuẩn. Cú pháp khá đơn giản và rõ ràng nếu bạn hiểu rõ về hệ nhị phân:
byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111;
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;
Và đặc biệt ở điểm khai báo các biến cấp lớp dưới dạng mã nhị phân, hoàn toàn không có vấn đề gì khi khởi tạo một biến tĩnh bằng cách sử dụng ký hiệu nhị phân:
public static final int thingy = 0b0101;
Chỉ cần cẩn thận để không làm tràn các số với quá nhiều dữ liệu, nếu không bạn sẽ gặp lỗi trình biên dịch:
byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte
Bây giờ, nếu bạn thực sự muốn trở nên lạ mắt, bạn có thể kết hợp tính năng mới gọn gàng khác trong Java 7 được gọi là ký tự số với dấu gạch dưới. Hãy xem các ví dụ lạ mắt về ký hiệu nhị phân với dấu gạch dưới theo nghĩa đen:
int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;
Bây giờ nó không đẹp và sạch sẽ, chưa kể là rất dễ đọc?
Tôi đã lấy những đoạn mã này từ một bài báo nhỏ tôi đã viết về chủ đề này tại TheServerSide. Vui lòng kiểm tra nó để biết thêm chi tiết:
Java 7 và ký hiệu nhị phân: Làm chủ kỳ thi lập trình viên Java OCP (OCPJP)
Trong Java 7:
int i = 0b10101010;
Không có ký tự nhị phân trong các phiên bản Java cũ hơn (xem các câu trả lời khác để biết các lựa chọn thay thế).
_
nhân vật để làm cho trình tự dễ đọc hơn: int i = 0b1010_1010_0011;
Không có ký tự nhị phân trong Java, nhưng tôi cho rằng bạn có thể làm điều này (mặc dù tôi không hiểu rõ vấn đề):
int a = Integer.parseInt("10101010", 2);
Câu trả lời từ Ed Swangren
public final static long mask12 =
Long.parseLong("00000000000000000000100000000000", 2);
hoạt động tốt. Tôi đã sử dụng long
thay vì int
và thêm các bổ ngữ để làm rõ cách sử dụng có thể có như một mặt nạ bit. Tuy nhiên, có hai điểm bất tiện với cách tiếp cận này.
Tôi có thể đề xuất cách tiếp cận thay thế
public final static long mask12 = 1L << 12;
Biểu thức này cho thấy rõ ràng rằng bit thứ 12 là 1 (số đếm bắt đầu từ 0, từ phải sang trái); và khi bạn di con trỏ chuột, chú giải công cụ
long YourClassName.mask12 = 4096 [0x1000]
xuất hiện trong Eclipse. Bạn có thể xác định các hằng số phức tạp hơn như:
public final static long maskForSomething = mask12 | mask3 | mask0;
hoặc rõ ràng
public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);
Giá trị của biến maskForSomething
sẽ vẫn có sẵn trong Eclipse tại thời điểm phát triển.
Khai báo các hằng số:
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;
và sử dụng chúng
if( (value & ( FLAG_B | FLAG_D )) != 0){
// value has set FLAG_B and FLAG_D
}
Tìm kiếm "cú pháp ký tự Java" trên Google và bạn tìm thấy một số mục nhập.
Có một cú pháp bát phân (bắt đầu số của bạn bằng 0), cú pháp thập phân và cú pháp thập lục phân với tiền tố "0x". Nhưng không có cú pháp cho ký hiệu nhị phân.
Vài ví dụ:
int i = 0xcafe ; // hexadecimal case
int j = 045 ; // octal case
int l = 42 ; // decimal case
byte b = 0b01000001
(để dễ đọc hơn byte b = 0b0100_0001
).
Nếu bạn muốn lộn xộn với nhiều nhị phân, bạn có thể xác định một số hằng số:
public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;
Vân vân.
hoặc là
public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;
Câu trả lời hơi khó xử hơn một chút:
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() + "\"" );
}
}
kết quả đầu ra [java] bb phải là 2, giá trị là "2"