2010-11-04 137 views
7

我有一個字節數組。我想要訪問每個字節並希望獲得其相應的二進制值(8位),以便對其執行下一個操作。我聽說過BitSet,但有沒有其他解決方法?如何將字節轉換爲位?

謝謝。

+0

謝謝大家了!:)我嘗試了所有下面給出的東西,但我所做的事情是我從陣取單個字節,然後我採用的方法Integer.toBinaryString(字節值)。它給了我期望的輸出。 – Supereme 2010-11-04 16:49:49

回答

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

如果你只需要在二進制它的字符串表示,你可以簡單地使用Integer.toString()設置爲2二進制可選的第二個參數。

在執行常規位操作上的任何整數類型,你必須使用邏輯與位移操作符。

// 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有bitwise operators。見a tutorial example

Java編程語言還提供了對整型類型執行按位和位移操作的運算符。本節討論的操作符不太常用。因此,他們的報道很簡短;目的只是讓你意識到這些運營商的存在。

一元按位求補運算符「〜」反轉的位模式;它可以應用於任何整型,使得每個「0」爲「1」,每個「1」爲「0」。例如,一個字節包含8位;將該運算符應用於位模式爲「00000000」的值將其模式更改爲「11111111」。

A byte值是不可或缺的,您可以使用掩蔽操作檢查位狀態。 最低顯著位對應於面膜10x1,下位對應0x2

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

'if(b&0x1)'不能編譯。你必須使用'if(b&0x1 == 0x1)' – 2010-11-04 10:17:00

+0

謝謝。Java不是C ;-) – gimel 2010-11-04 10:24:09

4

您可能會發現沿着你正在尋找在Guava Primitives包什麼東西行。

或者,你可能想寫點東西像

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; 
} 

那不是測試,但這個想法是存在的。還可以輕鬆修改循環/賦值以返回其他數組(例如,intlong)。

+2

除非你使用了「elsewise」這個詞,否則會給出這個+1。 – 2010-11-04 11:26:59

0

嗯,我想我得到你的意思它是如何實現的。現在一個相當大的錯誤是,它不適用於負數。但是,假設你沒有使用它來讀取文件輸入,你可能仍然可以使用它。

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; 
}