2017-10-08 4 views
0
char ch; 

for (int i = 0; i < 10; i++) { 
    ch = (char) ('a' + i); 
    System.out.print(ch); //<- output small letter 
    ch = (char) ((int) ch & 65503); //<-- ??? 
    System.out.print(ch + " "); 
} 

S'il vous plaît expliquer la partie du Code ch = (char) ((int) ch & 65503);petite lettre à grand exemple java Shildt

Pourquoi avons-nous besoin 65503 pour cela?

+0

Ceci est un hack (et un mauvais code [nombre magique]). En général, l'arithmétique sur les caractères est valide dans des plages très étroites, ce qui rend la lecture souvent confuse et non extensible de façon naturelle. En outre, le véritable changement de cas doit être spécifique aux paramètres régionaux. Voir ['String toLowerCase (Locale locale)'] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toLowerCase (java.util.Locale)) –

Répondre

1

Java utilise des caractères UTF-16. Ces caractères prennent 2 octets. Le 65503 numéro a la configuration binaire de

1111 1111 1101 1111 
      ^  // only the 6th bit is 0 

Comme vous pouvez le voir seulement le 6 bit est 0. Lorsque vous utilisez ce numéro comme bit-mask et faire une sage bits et le fonctionnement (votre char & 65503), il tourne le 6 un peu de ce char off (en faire un zéro). Si vous regardez le ASCII table (ASCII et Unicode sont les mêmes pour l'alphabet latin), vous verrez que ce sixième bit est la différence entre les majuscules et les majuscules (la différence de valeur est exactement 32) . Donc, si vous avez de petits caractères latins, ils deviendront des caractères majuscules. Si vous avez des majuscules, cela ne fera rien, parce que leur 6ème bit est déjà 0. Donc, fondamentalement, c'est un hack à faire àUpperCase() sur les caractères latins.

+0

merci, oui tout est clair maintenant –

+0

@DimaBilan De rien, votez et acceptez la réponse s'il vous plait. – Dmitry

+0

Je pense que vous utilisez trop le terme "lettre latine". Cela est vrai pour toutes les lettres du bloc [C0 Controls and Basic Latin] (http://www.unicode.org/charts/nameslist/index.html) mais seulement certaines des lettres dans les contrôles C1 et Latin étendu -1 bloc, aucun dans le bloc Latin Extended-1, .... –