Vamos a desglosar el código línea por línea.
int checker = 0; Estamos iniciando un verificador que nos ayudará a encontrar valores duplicados.
int val = str.charAt (i) - 'a'; Estamos obteniendo el valor ASCII del carácter en la 'i' posición de la cadena y restandolo con el valor ASCII de 'a'. Como se supone que la cadena tiene solo caracteres inferiores, el número de caracteres está limitado a 26. Hece, el valor de 'val' siempre será> = 0.
if ((checker & (1 << val))> 0) devuelve falso;
corrector | = (1 << val);
Ahora esta es la parte difícil. Consideremos un ejemplo con la cadena "abcda". Idealmente, esto debería devolver falso.
Para la iteración de bucle 1:
Verificador: 00000000000000000000000000000000
val: 97-97 = 0
1 << 0: 00000000000000000000000000000001
corrector & (1 << val): 00000000000000000000000000000000 no es> 0
Por lo tanto, corrector: 00000000000000000000000000000001
Para la iteración de bucle 2:
Comprobador: 00000000000000000000000000000001
val: 98-97 = 1
1 << 0: 00000000000000000000000000000010
corrector & (1 << val): 00000000000000000000000000000000 no es> 0
Por lo tanto, corrector: 00000000000000000000000000000011
Para la iteración de bucle 3:
Verificador: 00000000000000000000000000000011
val: 99-97 = 0
1 << 0: 00000000000000000000000000000100
corrector & (1 << val): 00000000000000000000000000000000 no es> 0
Por lo tanto, corrector: 00000000000000000000000000000111
Para la iteración de bucle 4:
Verificador: 00000000000000000000000000000111
val: 100-97 = 0
1 << 0: 00000000000000000000000000001000
corrector & (1 << val): 00000000000000000000000000000000 no es> 0
Por lo tanto, corrector: 00000000000000000000000000001111
Para la iteración de bucle 5:
Comprobador: 00000000000000000000000000001111
val: 97-97 = 0
1 << 0: 00000000000000000000000000000001
corrector y (1 << val): 00000000000000000000000000000001 es> 0
Por lo tanto, devuelve falso.