2010-11-04 45 views
7

Tôi có một mảng byte. Tôi muốn truy cập mỗi byte và muốn giá trị nhị phân tương đương của nó (8 bit) để thực hiện các hoạt động tiếp theo trên nó. Tôi đã nghe nói về BitSet nhưng có cách nào khác để đối phó với điều này?Làm thế nào để chuyển đổi một byte thành bit?

Cảm ơn bạn.

+0

Cảm ơn tất cả các bạn! :) Tôi đã thử mọi thứ bên dưới nhưng những gì tôi đã làm là tôi đã lấy từng byte riêng lẻ từ mảng và sau đó tôi đã sử dụng phương thức Integer.toBinaryString (giá trị byte). Nó cho tôi kết quả mong muốn. – Supereme

Trả lời

3
byte ar[] ; 
byte b = ar[0];//you have 8 bits value here,if I understood your Question correctly :) 
8

Nếu bạn chỉ cần đại diện chuỗi của nó trong hệ nhị phân bạn chỉ có thể sử dụng Integer.toString() với tham số tùy chọn thứ hai thiết lập để 2 cho nhị phân.

Để thực hiện bit twiddling chung trên bất kỳ loại tích phân nào, bạn phải sử dụng toán tử logic và bitshift.

// tests if bit is set in value 
boolean isSet(byte value, int bit){ 
    return (value&(1<<bit))!=0; 
} 

// returns a byte with the required bit set 
byte set(byte value, int bit){ 
    return value|(1<<bit); 
} 
2

Java có bitwise operators. Xem a tutorial example.

Ngôn ngữ lập trình Java cũng cung cấp các toán tử thực hiện thao tác bit và bit shift trên các loại tích phân. Các toán tử được thảo luận trong phần này ít được sử dụng hơn. Vì vậy, bảo hiểm của họ là ngắn gọn; ý định là chỉ đơn giản là làm cho bạn biết rằng các toán tử này tồn tại.

Toán tử bổ sung bitwise unary "~" đảo ngược một mẫu bit; nó có thể được áp dụng cho bất kỳ loại tích phân nào, làm cho mọi "0" là "1" và mỗi "1" là "0". Ví dụ, một byte chứa 8 bit; áp dụng toán tử này cho một giá trị có mẫu bit là "00000000" sẽ thay đổi mẫu của nó thành "11111111".

Giá trị byte Không thể tách rời, bạn có thể kiểm tra trạng thái bit bằng cách sử dụng các hoạt động mặt nạ. Bit quan trọng nhất tương ứng với mặt nạ 1 hoặc 0x1, các bit tiếp theo tương ứng với 0x2 vv

byte b = 3; 
if((b & 0x1) == 0x1) { 
    // LSB is on 
} else { 
    // LSB is off 
} 
+0

'if (b & 0x1)' không biên dịch. Bạn phải sử dụng 'if (b & 0x1 == 0x1)' –

+0

Cảm ơn.Java không phải là C ;-) – gimel

4

Bạn có thể thấy một cái gì đó dọc theo dòng của những gì bạn đang tìm kiếm trong gói Guava Primitives.

Ngoài ra, bạn có thể muốn viết một cái gì đó giống như

public boolean[] convert(byte...bs) { 
boolean[] result = new boolean[Byte.SIZE*bs.length]; 
int offset = 0; 
for (byte b : bs) { 
    for (int i=0; i<Byte.SIZE; i++) result[i+offset] = (b >> i & 0x1) != 0x0; 
    offset+=Byte.SIZE; 
} 
return result; 
} 

Đó là chưa được thử nghiệm, nhưng ý tưởng là có. Cũng có những sửa đổi dễ dàng đối với các vòng lặp/nhiệm vụ để trả về một mảng khác (ví dụ: int hoặc long).

+2

Có thể đưa ra +1 này, ngoại trừ bạn đã sử dụng từ "khác". –

0

Vâng, tôi nghĩ mình có được những gì bạn muốn nói. Bây giờ một lỗi khá đáng kể với điều này là nó không hoạt động trên các số âm. Tuy nhiên, giả sử bạn không sử dụng nó để đọc các đầu vào của tệp, bạn vẫn có thể sử dụng nó.

public static ArrayList<Boolean> toBitArr(byte[] bytearr){ 
    ArrayList<Boolean> bitarr = new ArrayList<Boolean>(); 
    ArrayList<Boolean> temp = new ArrayList<Boolean>(); 
    int i = 0; 
    for(byte b: bytearr){ 
     while(Math.abs(b) > 0){ 
      temp.add((b % 2) == 1); 
      b = (byte) (b >> 1); 
     } 
     Collections.reverse(temp); 
     bitarr.addAll(temp); 
     temp.clear(); 
    } 
    return bitarr; 
} 
Các vấn đề liên quan