Votre question

[C] Décalage de registre

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
26 Avril 2006 09:47:55

Bonjour a tous!

Je cherche comment décaler un registre afin d'extraire une info de ce registre. :-D

Exemple: J'ai un registre de 4 bits (1001)
chaque bit correspond à un état (le 1er indique l'état d'un interupteur, le 2 eme l'état d'un moteur...) (ce n'est qu'un exemple ;-))

Je voulais savoir comment faire pour "extraire" l'un des bits pour que mon programme traite ce bit.

ie: Ne garder que le 2eme bit (état moteur) pour pouvoir le changer ou s'en servir. On m'a dit qu'il fallait d'abord décaler le registre de 2 bits (pour obtenir 10) .

1/ Je voudrais savoir comment décaler ce registre en C (ou C++) :-?

2/ Puis comment faire pour ensuite ce débarasser du dernier bit (ici un 1) pour n'obtenir plus que le bit désirer (le 2eme, un 0 dans cet exemple)

Il est possible que les mots que j'emploie ne soient pas tres exacts (registre, bits, décaler...). Merci de vous adapter a mon ... ignorance! ^^ ;-)

Merci

Autres pages sur : decalage registre

26 Avril 2006 12:32:47

les opérateurs << et >> réalisent le décalage à gauche et à droite.
l'opérateur ~ réalise la négation binaire.
l'opérateur & réalise le "et" binaire.
l'opérateur | réalise le "ou" binaire.

en supposant que les bits sont dans cet ordre :
3 2 1 0

r : registre
n : numéro du bit

pour connaitre la valeur du bit :
(r & (1 << n))? 1 : 0

pour mettre a jour la valeur du bit :
mette à zéro
r = r & ~( 1 << n)
mettre à un
r = r | (1 << n)
26 Avril 2006 15:15:57

Merci beaucoup chrisz! :-D

J'ai fait un petit programme pour tester tout ca:




#include<stdio.h>
#include<conio.h>
int main()
{
int touche,r,test,n; //r le registre, test le bit a analyser, n la place du chiffre a analyser dans l'ordre ...4, 3, 2, 1, 0.


while(touche!=27) //si la touche n'est pas "échap" refaire le traitement

{
printf("\n\nregistre = ??? , numero du chiffre a analyser = ??? , avec l'ordre: ...4 3 2 1 0.\n");
scanf("%d,%d",&r,&n); //avec une virgule pour séparer
printf("\nle registre est %d\n",r);
test=(r&(1<<(n)))?1:0; //test devient le bit numéro n
printf("\nle %deme chiffre est %d\n\n",n,test);
if (kbhit()) //si une touche est pressée faire:

touche=getch();

}


}



Je compile avec dev C++ (c'est pour ca qu'il y a "int main()" au début)

Mon probleme est dans la relation binaire/décimale.
En effet le registre que je dois rentré doit etre en décimale alors que ce programme travail en binaire.

exemple: si je rentre 1111 il me dis que le 3eme chiffre (le 1er en fait) est un 0 :-?
et lorsque je rentre 15 (1111 en binaire) il me donne bien un 1en 3eme position.

Je cherche donc un moyen pour taper le registre directement en binaire :-D
De la meme facon qu'avec un "0" devant un nombre en octal ou "0x" devant un nombre en hexadecimal,
que faut il mettre devant un nombre en binaire?
En espérant que ca existe... :-? , sinon je cherche un moyen de faire tout comme ^^.

Merci beaucoup!
Contenus similaires
a b L Programmation
26 Avril 2006 19:21:02

Je crois que ça n'existe pas pour le binaire.
De toutes façon pour les données binaires, on utilise toujours l'hexadécimal.
Au pire tu te fais la fonction qui convertit la chaine de caratères de 0 et 1 en valeur.
27 Avril 2006 11:51:01

tu peux essayer ça pour lire et écrire en binaire :
strtol pour convertir une chaine en entier, en spécifiant la base (binaire = 2)
ltoa pour convertir un entier en chaine, en spécifiant la base (binaire = 2)

char sz [] = "1111";
long r;
char tmp;
r = strtol(sz, NULL, 2);
printf("%d\n", r);
printf("%s\n", ltoa(r, tmp, 2));
27 Avril 2006 13:24:12

OK merci beaucoup, c'est tout bon!
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS