Shizudai Information AC (IT) Es ist der 6. Tag. Der Vortag (5. Tag) ist frei. Der Tag zuvor (4. Tag) ist asdfg0280 "Ich habe versucht, Nuxt.js zu verwenden".
Wenn Sie Java- und JVM-Spezifikationen zitieren, schreiben Sie diese als "Java §1.2.3" bzw. "JVM §4.5.6". Die Java / JVM-Version ist 11.
Unsigned right shift operator? Java hat einen Operator, der als vorzeichenloser Rechtsverschiebungsoperator bezeichnet wird.
int i = -4 >> 1; // -2 (signed right shift)
int j = -4 >>> 1; // 2147483646 (unsigned right shift)
Während die normale Verschiebung den Code durch Vorzeichenerweiterung (arithmetische Verschiebung) speichert, verschiebt sich die vorzeichenlose Rechtsverschiebung unverändert (logische Verschiebung), ohne sich um das Vorzeichenbit zu kümmern. (Java §15.19)
Warum hat Java diesen Operator, der nicht in C / C ++ enthalten ist?
Gemäß Java § 4.2.1 sind Javas integrierte Ganzzahltypen Es gibt die folgenden vier.
byte
(-128 ~ 127)short
(-32768 ~ 32767)int
(-2147483648 ~ 2147483647)long
(-9223372036854775808 ~ 9223372036854775807)char
( '\ u0000'
~ ' \ uffff'
, dh 0 ~ 65535)Wie Sie aus dem Wertebereich ersehen können, ist alles außer "char" signiert. (JVM §2.3 gibt außerdem an, dass nur "char" ohne Vorzeichen ist. )
Außerdem wird sogar "char" während des Schaltvorgangs intern in "int" konvertiert und dann in dem Vorgang verwendet. ("Unäre numerische Werbung", Java §5.6.1)
Gemäß JVM §2.11.1 lautet die Schichtoperationsanweisung von JVM Da es nur in int
und long
definiert ist, kann gesagt werden, dass Java bei Schichtoperationen keinen vorzeichenlosen Integer-Typ hat.
Was ist das Problem ohne den vorzeichenlosen Integer-Typ? Schauen Sie sich den folgenden Code an.
String toBits(int val) {
var builder = new StringBuilder();
for(int j = 0; j < Integer.SIZE; j++, val >>>= 1) {
builder.append((val & 1) == 1 ? "1" : "0");
}
return builder.reverse().toString();
}
Dies ist eine Funktion, die ein Argument vom Typ "int" verwendet und seine Bitdarstellung als "String" zurückgibt.
Beispiel:
-1
-> "11111111111111111111111111111111"
20181206
-> "00000001001100111111000011010110"
In der dritten Zeile wird ">>> =" verwendet (ein Operator, der ">>>" zuweist.
Selbst wenn es in der Java-Welt kein >>> gibt, bedeutet dies nicht, dass Sie diese Funktion nicht schreiben können. Wenn Sie jedoch den negativen Wert arithmetisch nach rechts verschieben, füllt 1 die oberen Bits in der Codeerweiterung, sodass für negative Zahlen spezielle Operationen erforderlich sind.
Wie Sie sehen können, stirbt in Java der nicht signierte Rechtsschichtoperator nicht ohne ihn, aber es erweist sich als bequemer.
In C / C ++ gibt es vorzeichenlose Ganzzahltypen, und der Standard schreibt vor, dass Verschiebungen für diese Typen logische Verschiebungen sind. Daher können Sie dasselbe auch ohne den richtigen Schaltoperator tun.
Der nächste Tag (7. Tag) ist frei. Übermorgen (8. Tag) ist hi97_ia16s "Die Geschichte der Entwicklung eines Systems zum automatischen Erwerb von Hochschulnoten mit Node.js". (Es gibt keine Leute auf beiden Seiten ...)
Recommended Posts