Ví dụ:cách thanh lịch nhất để chuyển đổi một byte đến một int trong Java
int a = 255;
byte b = (byte) a;
int c = b & 0xff; // Here be dragons
System.out.println(a);
System.out.println(b);
System.out.println(c);
Vì vậy, chúng ta bắt đầu với một giá trị số nguyên của 255, chuyển nó sang một byte (trở thành -1) và sau đó chuyển đổi nó trở lại đến một int bằng cách sử dụng một công thức ma thuật. Sản lượng dự kiến là:
255
-1
255
Tôi tự hỏi nếu điều này a & 0xff
là cách thanh lịch nhất để chuyển đổi này. checkstyle ví dụ phàn nàn về việc sử dụng số ma thuật tại địa điểm này và không nên bỏ qua giá trị này cho séc này vì ở những nơi khác 255 có thể thực sự là số ma thuật cần tránh. Và nó khá khó chịu để xác định một hằng số cho những thứ như thế này một mình. Vì vậy, tôi tự hỏi nếu có một phương pháp tiêu chuẩn trong JRE mà chuyển đổi này để thay thế? Hoặc có thể là hằng số đã được xác định với giá trị byte chưa được ký cao nhất (tương tự như Byte.MAX_VALUE là giá trị được ký cao nhất)
Vì vậy, để giữ cho câu hỏi ngắn gọn: Làm thế nào tôi có thể chuyển đổi byte thành int mà không cần sử dụng số ma thuật ?
Ok, cho đến nay các khả năng sau đây được đề cập:
- tiếp tục sử dụng
& 0xff
và bỏ qua những con số kỳ diệu 255 trong checkstyle. Nhược điểm: Những nơi khác có thể sử dụng số này trong một số phạm vi khác (không hoạt động bit) không được kiểm tra sau đó, quá. Ưu điểm: Ngắn và dễ đọc. - Xác định hằng số của riêng tôi cho nó và sau đó sử dụng mã như
& SomeConsts.MAX_UNSIGNED_BYTE_VALUE
. Nhược điểm: Nếu tôi cần nó trong các lớp khác nhau thì tôi phải định nghĩa lớp hằng số riêng của mình chỉ cho hằng số darn này. Ưu điểm: Không có số ma thuật ở đây. - Thực hiện một số phép toán thông minh như
b & ((1 << Byte.SIZE) - 1)
. Đầu ra trình biên dịch có nhiều khả năng giống nhau vì nó được tối ưu hóa thành một giá trị không đổi. Nhược điểm: Khá nhiều mã, khó đọc. Ưu điểm: Miễn là1
không được định nghĩa là số ma thuật (kiểu kiểm tra bỏ qua nó theo mặc định), chúng tôi không có số ma thuật ở đây và chúng tôi không cần xác định các hằng số tùy chỉnh. Và khi byte được định nghĩa lại thành 16 bit một ngày nào đó (Chỉ cần đùa) thì nó vẫn hoạt động vì sau đó Byte.SIZE sẽ là 16 và không 8.
Còn ý tưởng nào khác không? Có lẽ một số hoạt động thông minh bit-khôn ngoan mà là ngắn hơn sau đó một ở trên và chỉ sử dụng số như 0 và 1?
Tôi không hoàn toàn chắc chắn những gì bạn đang thực sự cố gắng để làm ở đây, hay đúng hơn, tại sao . ** CẢNH BÁO: Không được trộn các byte và ký tự! ** Một byte chỉ có thể chứa các ký tự ASCII 7 bit * chứ không phải ký tự Java! * Ký tự Unicode rộng 21 bit, không chỉ 7 bit ** và thậm chí 15/16 bit, * * hoặc. Java nội bộ đại diện cho các ký tự dưới dạng biến rộng (tức là 1 hoặc 2) đơn vị mã UTF-16 trong hầu hết các trường hợp (* ngoại lệ: * java.unit.regex nhất thiết phải sử dụng UTF-32 cho các mẫu của nó). Bạn có thể không hợp lý mặt nạ/tiết kiệm chỉ là 7 bit đặt hàng thấp từ một số lượng 21-bit và được trái với bất cứ điều gì hợp lý và có ý nghĩa. – tchrist
@tchrist: Tôi chưa từng đề cập đến các nhân vật ở đây. Nó chỉ là byte. 8 bit byte. Không nhiều không ít. – kayahr
Yah, ok. Nhưng * đã ký * số lượng 8 bit. – tchrist