Vamos quebrar o código linha por linha.
verificador int = 0; Estamos iniciando um verificador que nos ajudará a encontrar valores duplicados.
int val = str.charAt (i) - 'a'; Estamos obtendo o valor ASCII do caractere na posição 'i'th da string e subtraindo-o com o valor ASCII de' a '. Como a suposição é que a sequência é apenas de caracteres inferiores, o número de caracteres é limitado a 26. Hece, o valor de 'val' sempre será> = 0.
if ((verificador & (1 << val))> 0) retorna false;
verificador | = (1 << val);
Agora esta é a parte complicada. Vamos considerar um exemplo com a string "abcda". Idealmente, isso deve retornar falso.
Para iteração de loop 1:
Verificador: 000000000000000000000000000000000000
val: 97-97 = 0
1 << 0: 000000000000000000000000000000000001
verificador & (1 << val): 000000000000000000000000000000000000 não é> 0
Daí verificador: 000000000000000000000000000000000001
Para iteração de loop 2:
Verificador: 000000000000000000000000000000000001
val: 98-97 = 1
1 << 0: 000000000000000000000000000000000010
verificador & (1 << val): 000000000000000000000000000000000000 não é> 0
Daí verificador: 000000000000000000000000000000000011
Para iteração de loop 3:
Verificador: 000000000000000000000000000000000011
val: 99-97 = 0
1 << 0: 000000000000000000000000000000000100
verificador & (1 << val): 000000000000000000000000000000000000 não é> 0
Daí verificador: 000000000000000000000000000000000111
Para iteração de loop 4:
Verificador: 00000000000000000000000000000000111
val: 100-97 = 0
1 << 0: 000000000000000000000000000000001000
verificador & (1 << val): 000000000000000000000000000000000000 não é> 0
Daí verificador: 000000000000000000000000000000001111
Para iteração de loop 5:
Verificador: 0000000000000000000000000000001111
val: 97-97 = 0
1 << 0: 000000000000000000000000000000000001
verificador & (1 << val): 00000000000000000000000000000001 é> 0
Portanto, retorne false.