コードを行ごとに分解してみましょう。
intチェッカー= 0; 重複する値を見つけるのに役立つチェッカーを開始しています。
int val = str.charAt(i)-'a'; 文字列のi番目の位置にある文字のASCII値を取得し、ASCII値「a」で減算します。文字列は小文字のみであると想定されているため、文字数は26に制限されています。そうすると、 'val'の値は常に> = 0になります。
if((checker&(1 << val))> 0)return false;
チェッカー| =(1 << val);
これはトリッキーな部分です。文字列「abcda」の例を考えてみましょう。これは理想的にはfalseを返すはずです。
ループ反復1の場合:
チェッカー:00000000000000000000000000000000
値:97-97 = 0
1 << 0:00000000000000000000000000000001
チェッカー&(1 << val):00000000000000000000000000000000 is not> 0
したがって、チェッカー:00000000000000000000000000000001
ループ反復2の場合:
チェッカー:00000000000000000000000000000001
値:98-97 = 1
1 << 0:00000000000000000000000000000010
チェッカー&(1 << val):00000000000000000000000000000000 is not> 0
したがって、チェッカー:00000000000000000000000000000011
ループ反復3の場合:
チェッカー:00000000000000000000000000000011
val:99-97 = 0
1 << 0:00000000000000000000000000000100
チェッカー&(1 << val):00000000000000000000000000000000 is not> 0
したがって、チェッカー:00000000000000000000000000000111
ループ反復4の場合:
チェッカー:00000000000000000000000000000111
値:100-97 = 0
1 << 0:00000000000000000000000000001000
チェッカー&(1 << val):00000000000000000000000000000000 is not> 0
したがって、チェッカー:00000000000000000000000000001111
ループ反復5の場合:
チェッカー:00000000000000000000000000001111
値:97-97 = 0
1 << 0:00000000000000000000000000000001
チェッカー&(1 << val):00000000000000000000000000000001 is> 0
したがって、falseを返します。