bonjour,
considérons un octet 2C dans la base 16
si je devais connaitre son MSB et son LSB dois-je d'abord convertir l'octet en binaire?
-----
bonjour,
considérons un octet 2C dans la base 16
si je devais connaitre son MSB et son LSB dois-je d'abord convertir l'octet en binaire?
bonjour,
base 16 ?
la notion de MSB LSB est habituellement utilisée à partir de mot de 16 bits ( 2 octets)=> (MSB <<8)+ LSB
pourquoi faudrait -il le convertir en binaire ?
0x2C= 0B00101100
0010 1100
si on considere la taille minimale d'un octet ( MCU 8 bits)
pour un octet 0x2C , en base 8 (Hexadecimal)
MSB=2
LSB=C
attention au notion INTEL ou Motorola ou le MSB et LSB sont inversés ..
Dernière modification par paulfjujo ; 17/03/2021 à 12h13.
bonjour,
en fait tout dépend de ce que MSB/LSB signifie :
on peut comprendre mos/least significant byte et effectivement il faut au moins deux octets
ou bien most/least significant bit et là 2 bits suffisent.
Il n'y a pas d'inversion MSB/LSB à proprement parler entre Motorola et Intel c'est l'ordre d'adressage en mémoire qui est inversé, big endian/little endian, les valeurs ont bien sur la même écriture une fois chargées dans les registres du µP concerné
Il est plus facile de lire du Motorola que de l'Intel et c'est aussi plus facile à afficher car les octets sont alors rangés dans l'ordre qui va bien
JR
l'électronique c'est pas du vaudou!
oui je parle bien de celle làEnvoyé par jiherveon peut comprendre mos/least significant byte
d'où vient le 0x ?Envoyé par paulfjujo0x2C= 0B00101100
Sinon ce que je voulait dire par conversion binaire c'est faire 0010=2 1100=C et prendre ainsi le MSB dans le 2 et le LSB dans le C
Tu sembles confondre bit et byte au vu de ce que tu dis plus bas.
C'est une convention d'écriture pour indiquer que le nombre qui suit 0x est en base hexadécimale.
Pour savoir cela il faut en effet convertir en binaire, mais avec un peu d'entrainement on remarquera que pour un demi-octet impaire (0x1, 0x3, 0x5, 0x7, 0x9, 0xB, 0xD, 0xF) le LSB vaut 1 et que le MSB vaut 1 pour une demi-octet dont la valeur est plus grande que 0x7.
Dernière modification par Povogla ; 17/03/2021 à 13h30.
Bonjour,
Une très bonne réponse a été donnée par Povogla.
Toutefois, je pense qu'il y a une petite chose dans sa réponse qui est tout à fait correcte si on lit attentivement, mais qui peut introduire une confusion : il sera plus clair selon moi de dire que le MSB est à 1 lorsque la valeur de l'octet est > 0x7F.
(Anecdote : "demi-octet" est un terme correct et équivalent à "quartet")
D'autre part, je voudrais ajouter ma pierre à cet édifice, en prenant en considération un point qui me paraît important s'il s'agit d'un cas réel et non d'un cas d'école (information non précisée) et qui n'a pas encore été abordé dans la discussion : celui de la représentation en machine des dites valeurs.
En effet : la représentation, et donc la réponse au problème initial, vont changer selon le fait que le type de données est signé ou non.
Et également selon l'architecture utilisée, je précise donc que ma réponse sera faite pour les architectures utilisant la représentation en complément à deux pour les valeurs signées négatives, et une représentation binaire "classique" pour les valeurs positives ou non signées. C'est le cas de la majorité des systèmes actuels, à ma connaissance.
La réponse est plus facile pour moi à donner en langage C (mais se traduira aisément dans tous les langages supportant les opérateurs booléens et les décalages de registre). Pour les entiers en représentation non signée, on a :
En revanche, le premier bit n'est pas le bit de poids fort si l'on utilise des valeurs entières signées : il s'agit alors du second bit, le premier stockant le signe. De plus, la représentation en complément à deux inverse tous les bits sauf le LSB. On utilisera alors le code suivant :Code:MSB_unsigned = valeur >> (bits - 1) ; // Pour l'énoncé, bits = 8, mais c'est toujours intéressant d'avoir la formule générale ;-) LSB_unsigned = valeur & 1 ;
Les instructions ci-dessus corrigent la valeur du bit en fonction du signe : c'est comme si on demandait les MSB et LSB de la valeur absolue, mais sans avoir besoin de calculer celle-ci.Code:signBit = valeur >> (bits - 1) ; MSB_signed = signBit ^ (valeur >> (bits - 2)) & 1) ; LSB_signed = signBit ^ ((valeur - signBit) & 1) ;
Enfin, comme la demande ne le précisait pas non plus, si l'entrée est donnée en texte et non dans une variable de type entier, il est possible de la convertir (en C, à l'aide de sscanf() ), mais il sera plus rapide en l'occurence de faire un tableau de correspondance entre les quartets et leur MSB/LSB respectif et de considérer le premier et le dernier caractère de la chaîne.
Voilà... J'espère avoir été utile !
Bonne journée à tous
PS : je n'ai pas testé en machine les dernières instructions... mais sur mon papier elles semblent marcher
PPS : cela me semble plus être un problème de programmation que d'électronique... si un modérateur passe par là.
Dernière modification par Shuffle777 ; 18/03/2021 à 14h48.
bonsoir,
que ce soit signé (positif ou négatif) ou non le LSB reste le LSB puisque c'est le seul à conserver sa valeur lors de la complémentation à deux!
JR
l'électronique c'est pas du vaudou!
Ah oui, au temps pour moi et bien vu jiherve !
Du coup, on peut effectivement simplifier :
Code:MSB_signed = (valeur >> (bits - 1)) ^ (valeur >> (bits - 2)) & 1) ; LSB_signed = valeur & 1 ;