2016-07-27 1 views
3
opérateurs de bits

Permettez-moi de commencer par le problème:et signe

def word(byte1 : Byte, byte2 : Byte, byte3 : Byte, byte4: Byte) : Int = { 
    ((byte4 << 0)) | ((byte3 << 8)) | ((byte2 << 16)) | ((byte1 << 24)) 
    } 

Le but ici est assez simple. Compte tenu de 4 octets, placez-les dans un Int.

Le code ci-dessus ne fonctionne pas car il semble que l'opérateur de changement tente de préserver le signe. Par exemple, ceci:

word(0xFA.toByte, 0xFB.toByte, 0xFC.toByte, 0xFD.toByte).formatted("%02X") 

Produit FFFFFFFD quand je me serais attendu à FAFBFCFD.

Faire le plus petit problème:

0xFE.toByte << 8 

Produit -2 en complément de deux, pas 0xFE00.

Comment puis-je faire un changement sans les problèmes de signe?

+0

Pouvez-vous donner un exemple du problème de la '' fonction word''? Est-ce un problème avec la mise en œuvre actuelle? –

+0

@JeanLogeart la fonction 'word' fonctionne réellement comme je le veux. Ma question est de savoir comment je peux l'écrire sans avoir à faire le '& 0x000000FF' et' & 0x0000FF00' ... pour dépouiller le signe entreprise drôle. – vcsjones

+0

Curieusement, il y a un opérateur '>>>' qui ressemble à ce que je veux, mais pas d'opérateur '<<<'. – vcsjones

Répondre

4

ET les octets avec 0xFF pour annuler les effets de l'extension des signes avant le changement:

((byte4 & 0xFF) << 0) | ((byte3 & 0xFF) << 8) | ... 
+0

Ah. C'est mieux que la solution que j'ai trouvée. Merci beaucoup. – vcsjones

4

Votre suspicion est correct et répond @ user2357112 votre question.

Maintenant, vous pouvez utiliser ByteBuffer comme alternative propre:

def word(byte1 : Byte, byte2 : Byte, byte3 : Byte, byte4: Byte) : Int = 
    ByteBuffer.wrap(Array(byte1, byte2, byte3, byte4)).getInt 
+0

Merci, bon de savoir ce qui peut le faire hors de la boîte dans ce scénario. – vcsjones