J'ai l'intuition que vous avez obtenu ce code à partir du même livre que je suis en train de lire...Le code lui-même, ici, n'est pas aussi cryptique que les opérateurs- |=, &, et << qui ne sont pas normalement utilisés par nous layman - l'auteur n'a pas pris la peine de prendre le temps pour expliquer le processus et les mécanismes impliqués ici sont. Moi, j'étais content avec la réponse précédente sur ce sujet au début, mais uniquement sur un niveau d'abstraction. Je suis revenue parce que j'ai senti le besoin de plus d'explication concrète - l'absence de celle-ci me laisse toujours avec un sentiment de malaise.
Cet opérateur << est à gauche au niveau du bit shifter il prend la représentation binaire d'un nombre ou d'opérande et décale sur cependant de nombreux endroits spécifié par l'opérande ou le numéro de la droite comme dans les nombres décimaux seulement dans les binaires. Nous sommes en multipliant par la base 2-lorsque nous passons cependant de nombreux endroits, pas de base de 10 - de sorte que le nombre sur la droite est l'exposant et le nombre sur la gauche est une base de multiples de 2.
Cet opérateur |= prendre l'opérande de gauche et ou avec l'opérande à droite - et ce d'un'&'et les bits des deux opérandes à gauche et à droite.
Donc, ce que nous avons ici est une table de hachage qui est stockée dans un nombre binaire de 32 bits à chaque fois que le vérificateur obtient ou ( checker |= (1 << val)
) le représentant désigné en valeur binaire d'une lettre de son correspondant bits il est défini à true.
Le caractère de la valeur, et souhaitez avec le vérificateur (checker & (1 << val)) > 0
)- si elle est supérieure à 0, nous savons que nous avons un double - parce que les deux identiques bits défini à true, et avait ainsi va retourner true ou "1".
Il y a 26 binaire lieux dont chacune correspond à une lettre minuscule-l'auteur fait dire à assumer la chaîne ne contient que des lettres minuscules - et c'est parce que nous avons seulement 6 plus (en entier de 32 bits) lieux de gauche à consommer - et que nous obtenons une collision
00000000000000000000000000000001 2^0
00000000000000000000000000000010 b 2^1
00000000000000000000000000000100 c 2^2
00000000000000000000000000001000 d 2^3
00000000000000000000000000010000 e 2^4
00000000000000000000000000100000 f 2^5
00000000000000000000000001000000 g 2^6
00000000000000000000000010000000 h 2^7
00000000000000000000000100000000 i 2^8
00000000000000000000001000000000 j 2^9
00000000000000000000010000000000 k 2^10
00000000000000000000100000000000 l 2^11
00000000000000000001000000000000 m 2^12
00000000000000000010000000000000 n 2^13
00000000000000000100000000000000 o 2^14
00000000000000001000000000000000 p 2^15
00000000000000010000000000000000 q 2^16
00000000000000100000000000000000 r 2^17
00000000000001000000000000000000 s 2^18
00000000000010000000000000000000 t 2^19
00000000000100000000000000000000 u 2^20
00000000001000000000000000000000 v 2^21
00000000010000000000000000000000 w 2^22
00000000100000000000000000000000 x 2^23
00000001000000000000000000000000 y 2^24
00000010000000000000000000000000 z 2^25
a= 00000000000000000000000000000001
le vérificateur=00000000000000000000000000000000
le vérificateur='a' ou checker
le vérificateur=00000000000000000000000000000001
un et le vérificateur=0 pas dupes condition
chaîne 'az'
le vérificateur=00000000000000000000000000000001
z =00000010000000000000000000000000
z et le vérificateur=0 pas dupes
le vérificateur=z ou checker= 00000010000000000000000000000001
string 'azy'
le vérificateur=00000010000000000000000000000001
y =00000001000000000000000000000000
checker et y=0 pas dupes condition
le vérificateur= vérificateur ou y =00000011000000000000000000000001
string 'azya'
le vérificateur= 00000011000000000000000000000001
a= 00000000000000000000000000000001
un et le vérificateur=1, nous avons une dupe