2010-04-16 12 views
1

J'ai du mal à comprendre ce qui se passe dans les deux lignes avec le 0xFF7F et celui qui se trouve en dessous. Il y a un lien ici qui l'explique dans une certaine mesure. http://www.herongyang.com/java/Bit-String-Set-Bit-to-Byte-Array.html Je ne sais pas si 0xFF7F >> POSBIT) & oldByte) & 0x00FF sont censés être 3 valeurs « ensemble ou comment associées par ce qui est censé être lu. Si quelqu'un peut clarifier un peu mieux ce qui se passe ici, je l'apprécierais grandement.Méthode setBit java utilisant le décalage binaire et le code hexadécimal - question

private static void setBit(byte[] data, 
           final int pos, 
           final int val) { 
     int posByte = pos/8; 
     int posBit = pos%8; 
     byte oldByte = data[posByte]; 
     oldByte = (byte) (((0xFF7F>>posBit) & oldByte) & 0x00FF); 
     byte newByte = (byte) ((val<<(8-(posBit+1))) | oldByte); 
     data[posByte] = newByte; 
    } 

passé dans ce procédé en tant que paramètres à partir d'un procédé de selectBits était SetBit (out, i, val); Out = octet [] out = nouvel octet [numOfBytes]; (numOfBytes peut être 7 dans cette situation) i = qui est le numéro [57], le numéro d'origine du tableau PC1 int contenant les 56 entiers. val = qui est le bit extrait du tableau d'octets de la méthode getBit().

Répondre

2

Tout d'abord 0xFF7F est 1111 1111 0111 1111. Ceci est décalé à droite d'une quantité de bits calculée à partir du bit que vous passez en paramètre (donc celui que vous voulez définir).

Si vous spécifiez troisième bit posBit = 3 % 8 = 3 si

0xFF7F 1111 1111 0111 1111 
>> 3 0001 1111 1110 1111 

cette valeur est alors ANDed avec l'octet d'origine que vous modifiez, le résultat est que chaque bit est maintenu égal à oldBit bits d'origine, sauf celui qui est ANDED avec le bit 0, supposons que vous avez par exemple oldByte == 0111 1010, vous obtiendrez:

0111 1010 
& 1110 1111 
------------- 
    0110 1010 

la valeur est ANDED avec 0xFF juste pour jeter un bit que d ne correspond pas à un octet (car c'est au moins le neuvième bit) avant de faire le casting.

+0

Quelle est la signification des nombres hexadécimaux cependant? Pourquoi 0xFF7F et 0x00FF ont-ils été choisis dans ce cas? –

+0

Ils sont _masks_, ils sont utilisés avec l'opérateur AND pour sélectionner seulement quelques bits. Dans le premier cas, 0xFF7F est utilisé parce que vous voulez définir un bit spécifié de sorte que vous ayez tous les 1 sauf celui avec lequel vous voulez travailler (qui est décalé selon __pos__). Alors que 0x00FF est utilisé pour sélectionner seulement l'octet le plus bas d'une paire d'octets, puisqu'il sélectionne seulement les 8 bits inférieurs. – Jack

1

Une meilleure façon d'écrire ce serait:

private static void setBit(byte[] data, int index, boolean value) 
{ 
    final int byteIndex = index/8; 
    final int bitIndex = 7 - (index % 8); 

    final byte mask = (byte) (1 << bitIndex); 
    final byte valueBit = value ? mask : 0; 

    data[byteIndex] = (byte) ((data[byteIndex] & ~mask) | valueBit); 
}