2009-11-23 3 views
0

Poursuivant ma précédente question Why I cannot derive from long?type long, déplacement vers la gauche et les opérations Décalage droit

J'ai trouvé un problème intéressant.

Première étape:

4294967296 & 0xFFFFFFFF00000000 

Résultat: 4294967296.

Étape deux.

4294967296 & 0x00000000FFFFFFFF 

Résultat: 0

Aha, donc ici je suppose que 4.294.967.296 == 0xFFFFFFFF

Vérifions

(long)0x00000000FFFFFFFF 

Résultat: 4294967295. Fail.

double contrôle Let

4294967296 >> 32 

Résultat: 1. Fail.

La seule explication est que parce que j'utilise long où un peu de bits est réservé pour le signe. En C j'utiliserais unsigned long. Que pensez-vous les gars?

+1

Un nombre qui ressemble à ... 6 en décimal ne peut pas égaler un nombre qui ressemble à. ..F dans hex. On est pair et on est impair! – AakashM

Répondre

5
4294967296 & 0xFFFFFFFF00000000 = 4294967296 

Ceci indique que la valeur 4294967296 n'a pas de bits définis dans les 32 bits inférieurs. En fait, 4294967296 est 0x100000000, donc c'est vrai.

4294967296 >> 32 = 1 

Encore une fois, cohérente. En d'autres termes, votre conclusion selon laquelle 4294967296 est 0xFFFFFFFF est erronée, donc les vérifications restantes ne prendront pas cela en charge.

+0

Honte à moi. Merci.Mais je suis arrivé à cette conclusion débogage du code suivant qui ne fonctionne pas long a = 2; long b = 3; long emballé = a + b << 32; // maintenant déballons long a1 = packed & 0xFFFFFFFF; long b1 = emballé >> 32; Résultat: a1 = 0; b1 = 5; Où est une erreur? Doit être une erreur vraiment simple. –

+0

Désolé, la mise en forme ne fonctionne pas dans les commentaires –

+2

Votre problème est la précocité de l'opérateur. Plus est traité avant les changements de bits. Essayez "long packed = a + (b << 32);" – fyjham

1

Je pense que vous n'arrivez pas à comprendre l'opération bit à bit and. Le bit and retourne les bits qui sont définis dans les deux. Si les deux étaient les mêmes, alors

(4294967296 & 0xFFFFFFFF00000000) == 4294967296 

et

(4294967296 & 0xFFFFFFFF00000000) == 0xFFFFFFFF00000000 

serait à la fois tenir, mais ils ne évidemment pas.

3

Um ... Je ne sais pas pourquoi vous êtes arrivé aux conclusions que vous avez faites, mais 4294967296 est 0x100000000. Pour écrire les bits dans l'hexagone facilement lisible ...

0x0000000100000000 & 
0x00000000FFFFFFFF = 
0x0000000000000000 

0x0000000100000000 & 
0xFFFFFFFF00000000 = 
0x0000000100000000 

Ces deux éléments sont tout à fait logiques. Peut-être que vous vous méprenez un peu ET ... il cartographie les bits qui sont les mêmes dans les deux. Vos commentaires semblent plus appropriés à un XOR bit à bit qu'à un AND binaire (qui n'est pas l'opération que vous utilisez) ...

Questions connexes