2010-10-14 26 views
3
int x = 2; 

x = rotateInt('L', x, 1); // should return 4 

x = rotateInt('R', x, 3); // should return 64 

Voici le code, quelqu'un peut-il le vérifier et laissez-moi savoir ce qu'est l'erreur?bit shift en C

La compilation est réussie, mais elle indique Segmentation Fault lorsque je l'exécute.

int rotateInt(char direction, unsigned int x, int y) 
{ 
    int i; 

    for(i = 0; i < y; i++) 
    { 

    if(direction == 'R') 
    { 
     if((x & 1) == 1) 
     { 
     x = x >> 1; 
     x = (x^128);  
     } 
     else  
     x = x >> 1; 
    } 
    else if(direction == 'L') 
    { 
     if((x & 128) == 1) 
     { 
     x = x << 1; 
     x = (x^1);  
     } 
     else 
     x = x << 1; 
    } 
    } 
    return x; 
} 
+3

Si vous avez terminé avec votre question connexe d'il ya 10 minutes http://stackoverflow.com/questions/3928659/rotating-bits-of-any-integer-in-c vous voudrez peut-être accepter une réponse avant de déménager sur. – Dusty

Répondre

1

J'ai essayé sur mon ordinateur (MacBookPro/Core2Duo) et cela a fonctionné. En passant, quelle est votre architecture cible? Certains (plusieurs) processeurs effectuent une rotation au lieu de décalages lorsque vous utilisez les opérateurs C ">>" et "< <".

+0

Je fais ce programme sur une machine linux, qui est exécutée par mon instructeur .. – Tim

+0

OK, donc je suppose qu'il s'agit d'une machine Intel, qui ne tourne pas (du moins ce n'est pas le cas de ny Intel Core2Duo). Cependant, il masque l'argument avec 0xff dans le cas d'une rotation d'entier (c'est-à-dire "0xff00" 16 = 0 "mais" 0xff00 "40 = 0xff"). –

+0

Un compilateur qui effectuait une rotation de bits réelle plutôt qu'un décalage pur pour les opérateurs '<<' and '>>' serait non conforme. Je ne vois aucune marge de manœuvre dans les définitions des opérateurs. Ils sont des changements et ne tourne pas, et ont été depuis l'aube de la langue. Voir C99, section 6.5.7 où il est écrit "Le résultat de' E1 << E2' est la position "E1" des bits "E2" décalés vers la gauche, les bits vides sont remplis de zéros. " Il continue à décrire les limites du comportement défini dans le détail sanglant. Les quarts de droite sont décrits de la même manière, mais avec des limites légèrement différentes. – RBerteig

9

Commencez à perfectionner vos compétences de débogage maintenant. Si vous avez l'intention d'être ingénieur, vous devrez écrire des programmes variés et ainsi déboguer toute votre vie.

Une façon simple de démarrer le débogage consiste à insérer des instructions d'impression pour voir à quelle distance votre code le fait avant qu'il ne meure. Je vous recommande de commencer en isolant l'erreur.

+0

il imprime rien mais la faute de segmentation, c'est tout. – Tim

+0

Ce mens s'écrase avant votre première déclaration 'print'. Déplacez l'instruction d'impression plus tôt et réessayez. Répétez jusqu'à ce que vous sachiez quelle ligne est à l'origine de la segfault – Josh

+1

@Josh c'est exactement ce que j'allais dire, merci. N'oubliez pas de mettre un \ n dans votre instruction printf pour vider le flux. –

2

ne suis pas sûr de la faute de seg, mais je pense que

if((x & 128) == 1) 

devrait être

if((x & 128) == 128) 

ou tout simplement

if(x & 128) 
0

Lorsque vous utilisez ^ ne pas dire le ou opérateur |?