[JAVA] Warum gibt es in C / C ++ keinen vorzeichenlosen Rechtsverschiebungsoperator?

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".

Einführung

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?

Java hat keinen vorzeichenlosen numerischen Typ

Gemäß Java § 4.2.1 sind Javas integrierte Ganzzahltypen Es gibt die folgenden vier.

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.

Die Notwendigkeit für unsignierte Schichten

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.

Warum es in C / C ++ keinen Rechtsverschiebungsoperator gibt

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.

Ende

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

Warum gibt es in C / C ++ keinen vorzeichenlosen Rechtsverschiebungsoperator?
Wenn im Docker-Protokoll keine Ausgabe für stdout vorhanden ist
Anfangswert, wenn die Spring-Anforderung keine Eigenschaft des Formularobjekts enthält
gradles mybatis-generator-plugin sagt, dass es kein MapperAnnotationPlugin gibt
[Deep Learning von Grund auf neu] 2. In Java gibt es kein NumPy.