2010-07-15 4 views
2

Cela fait un moment que je suis à l'université (20 ans pour être exact). Quand quelqu'un vous donne un nombre, disons 19444, et dit que X est les bits 15 à 8 et Y sont les bits 7 à 0 ... comment calculer les valeurs de X et Y? Je promets que ce n'est pas un devoir, juste un gars logiciel essayant imprudemment de faire une programmation de firmware.Ma logique de bits est trop obsolète. Refresher needed

+1

Programmation en langage assembleur (lequel?) Ou autre chose (C/C++)? – Artelius

Répondre

7

d'abord convertir le nombre d'entrée en hexadécimal:

19444 => 0x4BF4 

Hex est pratique car tous les 4 bits binaires sont un chiffre hexadécimal. Par conséquent, tous les 2 chiffres hexadécimaux sont 8 bits, ou un octet. Maintenant, en supposant que la notation little-endian traditionnelle (le chercher!), Les bits 7 downto 0 sont l'octet bas, les bits 15 downto 8 sont l'octet haut:

[7:0] => 0xF4 
    [15:8] => 0x4B 
+1

+1 pour expliquer les choses. – Kobi

+1

L'Endianness n'est pas pertinent (à moins que vous n'accédiez à des octets individuels en utilisant un pointeur ou une magie d'union - ce qui peut se produire si ce matériel provient d'une ligne série, etc.). – Artelius

+0

@Artelius: Je ne suis pas d'accord. Avec quelques interprétations d'endinaness, [7: 0] (ou plutôt [0: 7]) serait l'octet haut. C'est ** très ** pertinent –

3

Utilisation de votre langue préférée, vous pouvez obtenir le moins significatif octet en utilisant bitwise ET:

Y = 19444 & 0xff 

ou, plus mathématique:

Y = 19444 % 256 

maintenant, pour l'octet le plus important, vous pouvez utiliser décalages de bits (si le nombre est LARGET de deux octets, appliquer le F première étape à nouveau):

X = 19444 >> 8 
1

De même, attention à l'ordre des octets (que l'octet le plus significatif arrive en premier).

+0

Pas dans ce cas. * La numérotation des bits peut être pertinente. –

+0

L'ordre des octets n'est pas pertinent ici car il n'y a aucune mention d'adresses mémoire. – Artelius

1

Lorsque des positions de bits sont données (comme "15 à 8"), par convention, le bit 0 est le bit le moins significatif du nombre binaire. Si vous traitez un numéro de 16 bits, le bit 15 est le bit le plus significatif.

Un chiffre hexadécimal correspond à 4 chiffres binaires. Donc hex FF est 11111111 en binaire. Bitwise AND est souvent utilisé pour "masquer" une certaine collection de bits.

Presque tous les processeurs fournissent une forme de décalage bit à bit. Par exemple, en décalant 1010001 à droite de 4 bits, vous obtenez 101.

La combinaison de tout cela, en C vous généralement faire quelque chose comme ceci:

unsigned short int num; 
unsigned char x, y; 

num = 19444; 

y = num & 0xff; //use bitwise AND to get 8 least-sig bits 
x = num >> 8; //right-shift by 8 bits to get 8 most-sig bits 
3

(Ce qui suit suppose la notation C). En général, pour accéder à la valeur en bits de N par M, où N est la plus petite valeur et les bits sont numérotés de 0, l'utilisation:

(value >> N) & (1U << (M - N + 1)) - 1; 

Donc, pour les bits 0..7, l'utilisation:

(value >> 0) & (1U << 8) - 1 

et pour les bits 8..15, utilisez:

(value >> 8) & (1U << 8) - 1 

Notez que dans le cas où « N par M » est toute la largeur du type, vous ne pouvez pas utiliser le changement comme écrit.