Làm thế nào tôi có thể lặp bit trong một mảng byte?Java Iterate Bits trong Byte Array
Trả lời
Bạn sẽ phải viết thực hiện của riêng bạn Iterable<Boolean>
mà mất một mảng byte, và sau đó tạo ra Iterator<Boolean>
giá trị mà nhớ đến chỉ số hiện tại vào mảng byte và chỉ số hiện tại trong byte hiện tại. Sau đó, một phương pháp tiện ích như thế này sẽ có ích:
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(trong đó bit
nằm trong khoảng từ 0 đến 7). Mỗi lần next()
được gọi là bạn phải tăng chỉ số bit của bạn trong byte hiện tại và tăng chỉ số byte trong mảng byte nếu bạn đạt đến "bit thứ 9".
Nó không thực sự là cứng - nhưng hơi đau. Hãy cho tôi biết nếu bạn muốn triển khai mẫu ...
Bạn có thể lặp qua mảng byte và mỗi byte sử dụng toán tử bitwise để lặp qua các bit của nó.
gốc:
for (int i = 0; i < byteArray.Length; i++)
{
byte b = byteArray[i];
byte mask = 0x01;
for (int j = 0; j < 8; j++)
{
bool value = b & mask;
mask << 1;
}
}
Hoặc sử dụng Java thành ngữ
for (byte b : byteArray) {
for (int mask = 0x01; mask != 0x100; mask <<= 1) {
boolean value = (b & mask) != 0;
}
}
tôi cần một số bit truyền trong ứng dụng của tôi. Here bạn có thể tìm thấy thực thi BitArray của tôi. Nó không phải là một mô hình vòng lặp thực sự nhưng bạn có thể yêu cầu 1-32 bit từ mảng theo cách trực tuyến. Ngoài ra còn có một thực hiện thay thế được gọi là BitReader sau này trong tập tin.
Một thay thế sẽ được sử dụng một BitInputStream như một trong những bạn có thể tìm here và viết mã như thế này:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
(Lưu ý:. Mã không chứa EOFException hoặc IOException xử lý cho ngắn gọn)
Nhưng tôi muốn đi với biến thể Jon Skeets và tự mình làm.
Tôi biết, có lẽ không phải là cách "thú vị nhất" để thực hiện điều đó, nhưng bạn có thể trích xuất từng bit bằng mã sau đây.
int n = 156;
String bin = Integer.toBinaryString(n);
System.out.println(bin);
char arr[] = bin.toCharArray();
for(int i = 0; i < arr.length; ++i) {
System.out.println("Bit number " + (i + 1) + " = " + arr[i]);
}
số Bit 1 = 1
số Bit 2 = 0
số Bit 3 = 0
sốBit 4 = 1
số Bit 5 = 1
số Bit 6 = 1
Bit số 7 = 0
Bit số 8 = 0
Thật tuyệt vời vì nó không sử dụng những hoạt động bit "đáng sợ" đó. – Reginaldo
Tôi không thấy bất kỳ nhu cầu sử dụng toán tử bitwise cho một cái gì đó đơn giản như OP được yêu cầu: lặp qua các bit. – amischiefr
Điều này sẽ trả lời câu hỏi tốt hơn nếu nó cho thấy làm thế nào để trích xuất các bit từ một mảng * * * (thay vì String hoặc mảng char) – Jonik
public class ByteArrayBitIterable implements Iterable<Boolean> {
private final byte[] array;
public ByteArrayBitIterable(byte[] array) {
this.array = array;
}
public Iterator<Boolean> iterator() {
return new Iterator<Boolean>() {
private int bitIndex = 0;
private int arrayIndex = 0;
public boolean hasNext() {
return (arrayIndex < array.length) && (bitIndex < 8);
}
public Boolean next() {
Boolean val = (array[arrayIndex] >> (7 - bitIndex) & 1) == 1;
bitIndex++;
if (bitIndex == 8) {
bitIndex = 0;
arrayIndex++;
}
return val;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] a) {
ByteArrayBitIterable test = new ByteArrayBitIterable(
new byte[]{(byte)0xAA, (byte)0xAA});
for (boolean b : test)
System.out.println(b);
}
}
- 1. Java Byte Array conversion Số phát hành
- 2. Byte Array trong Python
- 3. Byte Array vào NSData
- 4. Chuyển đổi Byte Array thành bit Array?
- 5. byte-array là bitfield trong C#?
- 6. So sánh Java Array
- 7. Scala: InputStream to Array [Byte]
- 8. Đang tải Assembly Byte Array
- 9. Chuyển đổi Byte Array thành Bitset
- 10. Overotobuf-net OverwriteList trên Byte Array
- 11. Cách xác định Thứ tự [Array [Byte]]?
- 12. Chuyển đổi UIImage sang Byte Array
- 13. Lưu Byte Array UNC Đường dẫn
- 14. Byte Array để chuyển đổi hình ảnh
- 15. Chuyển đổi Byte Array thành hình ảnh trong Java - mà không biết loại
- 16. Java: Đọc một tệp pdf từ URL vào Byte array/ByteBuffer trong applet
- 17. $ size, $ bits, verilog
- 18. Đọc một Tệp vào một Byte Array (PHP)
- 19. Phỏng vấn: Flipping Bits
- 20. C#, bits & bytes - Làm thế nào để lấy các giá trị bit từ một byte?
- 21. Java: byte [] tới Byte []
- 22. Java - Byte [] tới byte []
- 23. java array thread-safety
- 24. Java Jagged Array
- 25. Cách tạo JSON Array trong Java
- 26. Sắp xếp ArrayList of Array trong Java
- 27. Chuyển đổi Array chuỗi trong Java/groovy
- 28. Chuyển đổi Byte Array chuỗi sử dụng TransactSQL
- 29. Cắt mảng byte trong Java
- 30. Java Array Liệt kê Issue
Bạn không thể.Ít nhất không trực tiếp. Bạn đang cố gắng làm gì, có lẽ có một cách tốt hơn. Một mảng byte chứa một tập hợp các byte. – OscarRyz
Và một lần nữa, tôi ước rằng java.util.BitSet có một hàm tạo byte []. –
Nó có thể được thực hiện. Tôi sẽ bầu bạn đi với phương pháp của Jon Skeet. Tuy nhiên, trong hầu hết các trường hợp khi làm việc với bit, có một số toán tử bitwise ưa thích có thể làm cho công việc của bạn đi nhanh hơn nhiều. Nếu bạn cho chúng tôi biết những gì bạn đang cố gắng làm, chính xác, chúng tôi có thể giúp bạn tìm một cách tốt hơn so với lặp lại các bit. – StriplingWarrior