Comment définir tous les bits sur "1" dans un nombre binaire de taille inconnue?

StackOverflow https://stackoverflow.com/questions/818535

  •  03-07-2019
  •  | 
  •  

Question

J'essaie d'écrire une fonction en assembleur (mais supposons que la question est agnostique pour le langage).

Comment utiliser les opérateurs au niveau des bits pour définir tous les bits d’un nombre transmis à 1?

Je sais que je peux utiliser le bitwise & "ou &"; avec un masque avec les bits que je souhaite définir, mais je ne sais pas comment construire un masque basé sur un nombre binaire de taille N.

Était-ce utile?

La solution

~ (x & amp; 0)

x & amp; 0 donnera toujours 0 et ~ retournera tous les bits en 1.

Autres conseils

Définissez-le sur 0, puis basculez tous les bits sur 1 avec un bitwise-NOT.

Vous allez découvrir qu'en langage assembleur, vous devez connaître la taille d'un " nombre passé & ";". Et en langage assembleur, le choix de la machine à utiliser est vraiment important.

Étant donné ces informations, vous demandez peut-être soit

  • Comment définir un registre entier sur 1 bit?

ou

  • Comment remplir une région en mémoire avec tous les 1 bits?

Pour remplir un registre avec tous les bits 1, la plupart des machines utilisent deux instructions:

  1. Effacez le registre à l'aide d'une instruction d'effacement spéciale, ou chargez immédiatement 0, ou xorez le registre avec lui-même.

  2. Prenez le complément au niveau des bits du registre.

Remplir la mémoire avec 1 bits nécessite alors une ou plusieurs instructions de stockage ...

Vous trouverez beaucoup plus de trucs et astuces dans le livre magnifique de Hank Warren, Le délice de Hacker .

Définissez x sur 1

Alors que x < nombre   x = x * 2

Réponse = nombre ou x - 1.

Le code suppose que votre entrée s'appelle " numéro " ;. Cela devrait fonctionner correctement pour les valeurs positives. Remarque: pour les valeurs négatives qui sont deux complémentaires, la tentative d’opération n’a aucun sens car le bit haut sera toujours égal à un.

Définissez-le sur -1. Ceci est généralement représenté par 1.

Utilisez T(~T(0)).

T est le nom de type (si nous parlons de C ++.)

Ceci empêche la promotion non souhaitée vers int si le type est inférieur à <=>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top