2013-06-06 18 views
5

Tôi có một bitmask được lưu trữ trong một byte, vì tôi chỉ cần 8 bit. Khi tôi tạo nó, tôi làm nó như một String (tôi nghĩ nó sẽ dễ dàng hơn theo cách này) và sau đó tôi chuyển nó thành một byte với Byte.parseByte(mask,2), nhưng tôi thấy nó không hoạt động với một số giá trị:Tại sao Byte.parseByte ("10000001", 2) ném một NFE?

String bits="10000001"; 
Byte.parseByte(bits,2);// throws a NFE 

Nhưng nếu tôi làm:

byte b=(byte)0x81; //1000 0001 

Không có vấn đề gì.

PS: Tôi tìm thấy một workaround, byte b=(byte)Integer.parseInt(bits, 2); nhưng dù sao tôi muốn biết tại sao tôi không thể chuyển đổi 8 bit thành một byte

+1

Câu trả lời ngắn gọn: vì 'byte' được ký. –

+0

Có, tôi biết điều đó, số 1 đầu tiên cho biết đó là số âm. Quan điểm của tôi là không phải là một vấn đề. Làm thế nào tôi có thể lưu trữ -127 sau đó, nếu tôi nhận được một String? –

Trả lời

7

10000001 nhị phân là 129 thập phân. Ergo, nó lớn hơn Byte.MAX_VALUE.

giải pháp của bạn

byte b=(byte)0x81; //1000 0001 

sẽ dẫn đến b có giá trị -127. Điều tương tự cũng đúng cho cách giải quyết của bạn.

+0

Vì vậy, nó chỉ là Byte.parseByte chức năng không có khả năng lưu trữ một byte nhất định, nó cần phải biến nó thành một số trước. Tôi nghĩ rằng nó sẽ làm một cái gì đó giống như thêm 1s và sau đó chuyển chúng. 0x81 cũng là 129 nhưng nó hoạt động –

Các vấn đề liên quan