[JAVA] Pourquoi n'y a-t-il pas d'opérateur de décalage à droite non signé en C / C ++?

Shizudai Information AC (IT) C'est le 6ème jour. La veille (5e jour) est vacante. La veille (4ème jour) est asdfg0280 "J'ai essayé d'utiliser Nuxt.js".

introduction

Lorsque vous citez les spécifications Java et JVM, écrivez respectivement "Java §1.2.3" et "JVM §4.5.6". La version Java / JVM est 11.

Unsigned right shift operator? Java a un opérateur appelé l'opérateur de décalage droit non signé.

int i = -4 >>  1; // -2         (signed right shift)
int j = -4 >>> 1; // 2147483646 (unsigned right shift)

Alors que le décalage normal enregistre le code par expansion de signe (décalage arithmétique), le décalage droit non signé se décale tel quel (décalage logique) sans se soucier du bit de signe. (Java §15.19)

Pourquoi Java a-t-il cet opérateur, qui n'est pas en C / C ++?

Java n'a pas de type numérique non signé

Selon Java § 4.2.1, les types d'entiers intégrés de Java sont Il y a les quatre suivants.

Comme vous pouvez le voir dans la plage de valeurs, tout sauf «char» est signé. (JVM §2.3 indique également que seul char est non signé. ) De plus, même «char» est converti en interne en «int »pendant l'opération de décalage, puis utilisé dans l'opération. ("Promotion numérique unaire", Java §5.6.1) Selon JVM §2.11.1, l'instruction d'opération de décalage de JVM est Comme il n'est défini que dans int et long, on peut dire que Java n'a pas de type entier non signé lorsqu'il s'agit d'opérations de décalage.

Le besoin de quarts de travail non signés

Maintenant, quel est le problème sans le type entier non signé? Jetez un œil au code suivant.

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();
}

Il s'agit d'une fonction qui prend un argument de type ʻintet renvoie sa représentation binaire sous la forme deString. Exemple: -1->"11111111111111111111111111111111" 20181206->"00000001001100111111000011010110"`

La troisième ligne utilise >>> = (un opérateur qui affecte while >>>.

Même s'il n'y a pas de >>> dans le monde Java, cela ne signifie pas que vous ne pouvez pas écrire cette fonction. Cependant, si vous décalez la valeur négative arithmétiquement vers la droite, 1 remplira les bits supérieurs dans le développement de code, des opérations spéciales sont donc nécessaires pour les nombres négatifs.

Comme vous pouvez le voir, en Java, l'opérateur de décalage droit non signé ne meurt pas sans lui, mais il s'avère plus pratique.

Pourquoi il n'y a pas d'opérateur de décalage vers la droite en C / C ++

En C / C ++, il existe des types entiers non signés, et la norme stipule que les décalages pour ces types sont des décalages logiques. Par conséquent, vous pouvez faire la même chose sans le bon opérateur de décalage.

fin

Le jour suivant (7e jour) est vacant. Le lendemain (8e jour) est celui de hi97_ia16 "L'histoire du développement d'un système pour acquérir automatiquement des notes universitaires avec Node.js". (Il n'y a personne de chaque côté ...)

Recommended Posts

Pourquoi n'y a-t-il pas d'opérateur de décalage à droite non signé en C / C ++?
Lorsqu'il n'y a pas de sortie vers stdout dans le journal du docker
Valeur initiale lorsqu'il n'y a pas de propriété de l'objet de formulaire dans la requête Spring
Le plugin mybatis-generator-plugin de gradle indique qu'il n'y a pas de MapperAnnotationPlugin
[Apprentissage profond à partir de zéro] 2. Il n'existe pas de NumPy en Java.