コードを理解するために例を挙げてみましょう。
1) メソッドtoUpper()に文字「p」を渡すとします。
2) これで、アルファベットは「a」と「z」の間にあるため、if ステートメントの条件は常に真になります。
3) if ステートメント内には、次のコードがあります。
return (char) (c & ~('a' - 'A'));
4)上記のステートメントでは、この部分
('a' - 'A')
括弧内にあるため、常に最初に実行されます。ここでは、'a' から 'A' を引いているだけです。つまり、ASCII 値である 97-65 です。(A ---> 65 および a ---> 97)。したがって、 toUpper()メソッドに渡す文字に関係なく、答えは常に 32 になります。
5) 演算子~ ieはどのように存在するのか
~('a' - 'A')
('a' - 'A') の答えは常に 32 になると言ったので、演算子 ~ は 32 に適用されます。
~32
演算子 ~ の出力を予測するための式は次のとおりです。
~(数値)
= -(数値) - 1
ここでは数値が 32 であるため、上記の式からの ~32 の出力は
-(32) - 1
= -32 - 1
= -33
したがって、の出力
~('a' - 'A')
常に -33 になります
5) 今、あなたは持っています
(c & ~('a' - 'A'))
すなわち
(c & -33)
ここで c にはユーザーが渡すアルファベットがあり、この例では 'p' です。
すなわち
p & -33
「p」の ASCII 値は 112 であるため、
112 & -33
すなわち
1110000 & 1011111
これは、2 進数で 112 と -33 の対応する値です。
したがって、演算子を適用した後、 & を取得します
1010000
6) 1010000 を 10 進数に変換すると、大文字のアルファベット 'P' の ASCII 値である 80 が得られます。
7) したがって、一般的に、実行される操作は次のようになります。
(ASCII value of user inputted alphabet) & -33
8)もう1つ「JavaはUnicodeに対応しています。しかし、Unicodeの最初の文字セットはASCIIであり、@paxdiabloも言っています。したがって、上記の回答でASCIIについて言及しました。