2010-03-05 4 views
5

Si j'ai un nombre binaire de 32 bits et que je veux remplacer les 16 bits inférieurs du nombre binaire par un nombre de 16 bits que j'ai et garder les 16 bits supérieurs de ce nombre à produire un nouveau nombre binaire .. comment puis-je le faire en utilisant un opérateur bitwise simple?Algorithme pour le fiddling bitwise

Par exemple, le nombre binaire 32 bits est:

1010 0000 1011 1111 0100 1000 1010 1001 

et 16 bits inférieure j'est:

    0000 0000 0000 0001 

donc le résultat est:

1010 0000 1011 1111 0000 0000 0000 0001 

Comment puis-je faire ceci?

+0

Je veux le faire en une seule étape – aherlambang

+0

Vous ne pouvez pas le faire avec 1 opérateur. Vous avez besoin d'au moins 2, et avec l'extension de signe concernée, 3. – polygenelubricants

Répondre

8

Vous faites cela en deux étapes:

  • Masquez les bits que vous souhaitez remplacer (ET avec 0s)
  • Remplissez les remplacements (OU avec les nouveaux bits)

donc, dans votre cas,

i32 number; 
i32 mask_lower_16 = FFFF0000; 
i16 newValue; 

number = (number AND mask_lower_16) OR newValue; 

dans l'implémentation du langage de programmation réelle, vous pouvez aussi avoir besoin pour résoudre le problème de l'extension de signe sur la valeur 16 bits. En Java, par exemple, vous devez masquer les 16 bits supérieurs du short comme ceci:

short v = (short) 0xF00D; 
    int number = 0x12345678; 
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF); 
    System.out.println(Integer.toHexString(number)); // "1234f00d" 
+3

+1. bien expliqué. –

+1

Si l'OP est un débutant, s'il vous plaît noter la différence entre logique ET (&&) et bitwise ET (&) –

+0

Terminé. Également adressé problème d'extension de signe. – polygenelubricants

3
(original32BitNumber & 0xFFFF0000) | 16bitNumber 
+1

la deuxième opération devrait être OU – vpram86

+0

Merci! J'ai dû faire cela des millions de fois et j'ai quand même réussi à taper la mauvaise chose! –

+0

+1 C'est tout !! –

1

Eh bien, je pourrais vous dire la réponse. Mais peut-être que c'est devoirs. Donc je ne le ferai pas.

Considérez que vous avez quelques options:

| // bitwise OR 
^ // bitwise XOR 
& // bitwise AND 

TIRAGE Peut-être une petite table et décider que l'on vous donnera le bon résultat (lorsque vous utilisez sur la partie droite de votre numéro binaire plus).

1

utilisez & pour masquer les bits faibles puis | de fusionner la valeur 16 bits avec la valeur 32 bits

uint a = 0xa0bf68a9 
short b = 1 

uint result = (a & 0xFFFF0000) | b;