2010-10-15 6 views
4

Étant donné ce code qui imprime tous les bits dans un entier sur:C# Pourquoi 127 = cette chaîne de bits?

private string getBitLiteral(bool bitVal) 
{ 
    if (bitVal) 
    { 
     return ("1"); 
    } 
    else 
    { 
     return ("0"); 
    } 
} 

 

Int64 intThisHand = 127; 

    for (int i = 64; i > 0; i--) 
    { 
     HttpContext.Current.Response.Write(
      getBitLiteral((intThisHand & (1 << i)) != 0) 
     ); 
    } 

Pourquoi faut-il imprimer sur:

1000000000000000000000000011111110000000000000000000000000111111 

suis d'abord je looper correctement que je Attendez-vous à ce que les 7 derniers chiffres soient 1's

Deuxièmement, pourquoi y a-t-il des 1 au milieu? Je m'attendrais à ce qu'ils soient tous à l'exception des 7 1 à la traîne.

Répondre

18

1 << i est un entier de 32 bits qui déborde donc. Je pense que 1l << i le réparerait.
((long)1)<<i peut être plus lisible.

De plus, vous avez une erreur "off-by-one". Vous voulez aller de 63 à 0 pas de 64 à 1. Depuis 1 < < 1 est 2 et non 1.

+0

Ah, comment Je modifie cela pour qu'il fonctionne correctement sur les entiers 64 bits? Il est très important que mon projet gère des entiers 64 bits. –

+0

Je pense qu'ajouter le suffixe l ou le lancer à long suffirait à résoudre ce problème. – CodesInChaos

+0

Une autre façon de gérer le problème 64 bits est d'utiliser '((intThisHand >> i) & 1)! = 0'. Comme intThisHand est déjà un entier de 64 bits, le décalage sera effectué correctement. –

7

Etes-vous curieux de savoir pourquoi votre code est cassé, ou essayez-vous simplement d'afficher le nombre comme binaire ?

Dans ce dernier cas, vous pouvez simplement le faire plutôt que de réinventer la roue:

string asBinary = Convert.ToString(intThisHand, 2); 

Ou, si vous voulez pad sur les 64 chiffres:

string asBinary = Convert.ToString(intThisHand, 2).PadLeft(64, '0'); 
+0

Bonne solution merci! –

Questions connexes