2010-11-04 27 views
7

Tek bir bayt dizim var. Her bir byte'a erişmek ve bir sonraki işlemleri gerçekleştirmek için eşdeğer ikili değerini (8 bitlik) istiyorum. BitSet'i duydum ama bununla uğraşmanın başka bir yolu var mı?Bayt, bitlere nasıl dönüştürülür?

Teşekkür ederiz. Sadece ikilik sistemde bunun dize temsilini gerekiyorsa

+0

sayesinde hepiniz! :) Ben bütün Aşağıda verilen şeyler peki ya sonra diziden bireysel bayt almış olduğu yaptık ve ben yöntemi Integer.toBinaryString (bayt değeri) kullanılmıştır çalıştı. İstediğim çıktıyı verdi. – Supereme

cevap

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

sadece ikili için 2 olarak ayarlandığında isteğe bağlı ikinci parametre ile Integer.toString() kullanabilirsiniz.

Herhangi bir integral türünde genel bit twiddling gerçekleştirmek için, mantıksal ve bitshift operatörleri kullanmanız gerekir.

// 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 sahiptir. Bakınız a tutorial example.

Java programlama dili, ayrılmaz tiplerde bit ve bit kaydırma işlemlerini gerçekleştiren operatörler sağlar. Bu bölümde tartışılan operatörler daha az kullanılmaktadır. Bu nedenle, kapsamları kısadır; Amaç, bu operatörlerin var olduğunun farkında olmanızı sağlamaktır.

Tekli bitlik tamamlayıcı işleç "~" bir bit desenini ters çevirir; Her "0" a "1" ve her "1" a "0" yapılarak integral tiplerinden herhangi birine uygulanabilir. Örneğin, bir bayt 8 bit içerir; bu operatörü, bit kalıbı "00000000" olan bir değere uygulayarak kalıbını "11111111" olarak değiştirir.

A byte value IS integral, maskeleme işlemlerini kullanarak bit durumunu kontrol edebilirsiniz. az önemli bit Sen Guava Primitives pakette aradığınızı çizgisinde bir şeyler bulabileceği 1 veya 0x1 sonraki bit 0x2 karşılık maske vb

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

'(b & 0x1)' derlenmezse. Kullanmanız gerekir eğer if (b & 0x1 == 0x1) ' –

+0

Teşekkürler.Java, C ;-) – gimel

4

karşılık gelir.

Alternatif olarak,

test edilmemiş
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; 
} 

gibi bir şey yazmak isteyebilirsiniz ama fikri yoktur. Başka bir şey dizisi döndürmek için döngüler/atamada kolay değişiklikler de vardır (örneğin, int veya long).

+2

değil, "elsewise" kelimesini kullandığınız dışında bir + 1 vermiş olur. –

0

java 7 kullanmıyorsanız eğer Eh ben ne demek istediğini elde düşünüyorum nasıl uygulandığı kaynak koduna bakmak gerekebilir. Şimdi bununla ilgili oldukça önemli bir hata, negatif sayılarda çalışmadığıdır. Ancak, dosya girişlerini okumak için kullanmadığınızı varsayarak, yine de kullanabilirsiniz.

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; 
} 
İlgili konular