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