Frage

        //key & hash are both byte[]
        int leftPos = 0, rightPos = 31;
        while(leftPos < 16) {
            //possible loss of precision. required: byte, found: int
            key[leftPos] = hash[leftPos] ^ hash[rightPos];
            leftPos++;
            rightPos--;
        }

Warum eine bitweise Operation in Java auf zwei Bytes zurückkehren würde einen int? Ich weiß, ich könnte es nur auf Byte zurückgeworfen, aber es scheint dumm.

War es hilfreich?

Lösung

Da die Sprache spec sagt. Es gibt keinen Grund, aber ich vermute, dass dies die am wahrscheinlichsten Intentionen:

  • Um einen kleinen und einfachen Satz von Regeln müssen arithmetische Operationen decken alle möglichen Kombinationen von Arten Einbeziehung
  • Um eine effiziente Implementierung zu erlauben - 32-Bit-Integer sind, was CPUs intern verwenden, und alles andere erfordert Umwandlungen, explizit oder implizit
  • .

Andere Tipps

Wenn es korrekt ist, und es gibt keinen Wert, der diesen Verlust an Genauigkeit führen kann, mit anderen Worten: „unmöglich Verlust an Präzision“ der Compiler sollte den Mund hält ... und muß korrigiert werden, und keine Besetzung soll hinzugefügt werden folgt aus:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);

Es gibt keine Java bitweise Operationen auf zwei Bytes. Ihr Code implizit und geräuschlos wandelt dieses Bytes auf einen größeren Integer-Typen (int), und das Ergebnis ist dieser Typ auch.

Sie können nun die geistige Gesundheit des Ausscheidens bitweise Operationen auf Bytes undefiniert in Frage stellen.

Dies irgendwo in den Antworten auf einer der ähnlichen Fragen war, dass die Menschen bereits hingewiesen haben:

http://blogs.msdn.com/oldnewthing /archive/2004/03/10/87247.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top