2016-12-03 1 views
-1

J'ai des nombres binaires (longueur de 32/64 bits) que je veux décaler vers la gauche pour que le bit de poids fort disparaisse. Tous les nombres binaires sont de longueur différente. Donc, je n'ai pas trouvé un moyen facile de le faire.Manipulation de bits en C - décalage vers la gauche pour supprimer le bit le plus significatif

Voici quelques exemples. Sur le côté gauche sont les nombres binaires avant et sur le côté droit les nombres binaires après le déplacement vers la gauche:

00000000000000000000000000101011011 -> 01011011000000000000000000000000000 
00000000000000000000100010110111011 -> 00010110111011000000000000000000000 
00000000000000000000000000000100110 -> 00110000000000000000000000000000000 
00000000000000111000101010101100010 -> 11000101010101100010000000000000000 

Comment peut-on faire en C?

+0

@Downvoter Je suis un débutant en C. Donc, je ne comprends pas la plupart de ce que je vois dans cet autre post. N'y a-t-il pas un moyen simple (exemple facile à comprendre) pour qu'un débutant puisse travailler avec? – Samuel

+0

L'autre article vous donne un ensemble de fonctions qui vous indiquent le nombre de zéros en tête d'une valeur. Vous pouvez ensuite passer à gauche par cette valeur plus 1. – dbush

+0

@dbush J'ai essayé de résoudre mon problème avec trois solutions différentes de ce poste. Malheureusement, cela ne fonctionne pas pour moi. La sortie n'est pas de la forme que je m'attendais. Une solution renvoie '11111111111111111010100110111001' et une autre solution renvoie' 0000000000000000000000000011011' lorsque je passe '0000000000000000010100110111001'. Quelqu'un peut-il me donner un indice de ce que je fais probablement mal? – Samuel

Répondre

-4
uint64_t number; 

for(int i = 0; (i < 64) && (number & 0x8000000000000000) == 0); i++) 
{ 
    number <<= 1; 
} 

number <<= 1; 

Ceci est une façon de le faire pour une valeur de nombre de 64 bits;

Fixé.

+0

Pour 'number == 0', ce sera une boucle sans fin. De plus 'le nombre << 1;' n'a aucun effet et nous finirons par une boucle sans fin. – Gerhardh

+0

Vous avez raison, j'ai corrigé le problème. – koper89

+1

J'ai essayé votre programme, mais cela ne fonctionne pas. – Samuel