電子書籍の厳選無料作品が豊富!

いつもお世話になっております。

以下のJavaのコードで、
☆の部分のif文が何を実施しているのか
分からないのですが、
ご存知の方がいられましたら
ご教授をいただけますでしょうか。

【コード】
String value = "あいうえお12345";
int length = value.length();
for (int i = 0; i < length; i++) {
char c = value.charAt(i);
if ((c & ~0x7f) != 0) { ←☆
処理1
}
}

A 回答 (3件)

まず、どんな計算をしているか。



単項~演算子: ビット毎のNOT演算
2項&演算子: ビット毎のAND演算
それぞれ、対象を1ビットずつ演算するものです。

つまり「c と、 ( 0x7fのNOT ) の AND」 の演算をします。
ここがわからなかったら、マニュアルや参考書の演算子のところを復習しましょう。


次にどんな効果があるのか。

ビット毎のANDは、特定のビットを0にするのに、よく使われます
ANDはどちらかが0なら0になるので、
x & 0x0f
等とすると、0x0fの1になっている桁はxのまま残り、他は0になります。
この場合なら、xの下位4ビットはそのまま、それより上位ビットは0になります。

~0x7fは、 0x7f(下位7ビットが1)を反転させた状態、つまり、下位7ビットが0、それ以外が1になります。
つまり、c & ~0x7f は、 cの下位7ビットを0にして、8ビットより上はcのままにします。

# それなら 0xff80 とかでもいいのでは、という話もありますが、これだと、16ビットより大きかったら上の桁が0になってしまいます。
~なら確実に計算時の最上位まで1になるので、桁のことを考えなくてもよくなります。

ここがわからなかったら、ビット演算を復習しましょう。


最後に、それで何をしたいか。
charAtは、指定した位置の文字の文字コードを返します。これはchar型で、UNICODEになっています。
8ビットより上位が0なら、 コードは 0x0000~0x007f の範囲で、これは、いわゆる半角英数記号にあたります。
プログラムでは != 0 ですから、そうではなく、 0x0080~0xffffの文字の場合にtrueになります。
ということで、「半角英数記号かどうか」の判定に使っているのだと思います。

ここは、なかなかいい勉強方法がなさそうです。
もうちょっとスマートにできないかなぁ、とも思います
    • good
    • 0

NO1です。


7fを反転して(08) → 反転したら(80)でした。
    • good
    • 0

7fを反転して(08)cとビット単位の掛け算をしています。



出てくるのはcの上位バイトになります。

半角英数は上位バイト=0、下位バイトは0ではなく、
全角文字は上位、下位とも0ではありません。

よって、全角文字だけ抽出しています。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!