Ho risolto.
Posto anche come ho fatto magari interessasse a qualcuno:
Codice PHP:
public static long getLongToBitSequence(int[] bitsequence){
String temp = "";
int count = 0;
int col = 7
long row = 0L;
for(int i = bitsequence.length-1; i >= 0; i--){
temp += bitsequence[i];
if(count == 7){
long tmp = Long.parseLong(temp, 2);
tmp = tmp << (col*8);
row |= tmp;
count = 0;
col--;
}else{
count++;
}
}
return row;
}
In pratica lavoro su 64bit come se avessi una matrice 8x8 infatti ho un contatore di riga (count) e uno di colonna (col).
Ogni volta che una riga finisce (count == 7) allora mi creo il long a partire dalla sequenza di 8 bit. A questo punto per mettere gli 8bit nella posizione giusta sui 64bit faccio uno schift per il valore della colonna * 8 (ho 8 bit per colonna) quindi faccio un or logico con la variabile che mi tiene il valore finale in modo da non perdere lavecchia informazione.
In questo modo non ho più il problema del segno perchè lavorando direttamente su un valore long legale lo shift mi produce un long negativo se il 63° bit è affermato.
NB l'array viene scansionato al contrario perchè il 63° bit cioè il primo bit a partire da sinistra è in indice 63 sull'array.
NNB La scelta di scorrere l'array al contrario è solamente una convenzione non succede nulla se si scorre l'array in avanti basta solo stare attenti a utilizzare il giusto valore di col per lo shift.
Ciao