Comment puis-je changer le bit le plus significatif dans un int de 1 à 0? Par exemple, je veux changer 01101 à 0101. P>
7 Réponses :
Le moyen le plus simple de faire des opérations bitwises, comme celui-ci consiste à utiliser l'opérateur de quart de vitesse gauche (<<).
alors vous utilisez une valeur dans laquelle Vous voulez changer un certain peu et utiliser comme ceci: p> (1 << 3) = 100b code>,
(1 << 5) = 10000B code> p>
| (Ou) si vous voulez le changer à un 1 ou de
& ~ (Et non) si vous voulez le changer à un 0. p>
(1 << 3) = 8, (1 << 5) = 32 code>
@ KG. ce sont des valeurs binaires
Ils n'étaient pas pendant que j'écris de commentaire
Cette réponse ne résout pas le problème que l'OP a demandé, car a = 13 code> n'est qu'un exemple (l'OP a dit "par exemple"). Il est clair que ce que veut la solution est une solution qui fonctionne pour un entier arbitraire.
La réponse que j'ai donnée ci-dessous est surchargée si votre seul but em> est de définir le bit le plus significatif à zéro. que le bit final de code construit un masque de bits qui inclut tous les bits dans le nombre. p> Voici la série de calculs qu'il effectue sur une donnée 32 bits Unsigned Integer: P> originalValue &= ~(uint)(1 << r); // Force bit "r" to be zero
Cela ressemble beaucoup au livre 'Hackers Delight'
@luketorjussen: Merci pour le bouchon! Je vérifierai ce livre :)
Quelqu'un a-t-il vérifié cette fonction?
@ L.b: Je n'ai pas, mais censé ce site a. Il y a 3 ou 4 variantes de plus sur ce site si vous n'aimez pas celui de la réponse. Après une certaine google, j'ai trouvé cette réponse qui ressemble à des liens vers des articles décrivant l'algorithme: Stackoverflow.com/questions/757059/...
@Merlyn Morgan-Graham, je ne veux pas discuter de l'algorithme. Ce que je voulais dire était, votre code ne fait pas ce qui est demandé dans la question. S'il vous plaît vérifier votre code puis voir ma réponse simplifiée
Je dois dire que la copie-pâte n'est pas toujours une solution.
@ L.b.: Le code d'origine, la partie que j'ai copiée - est correcte (il doit être converti en C # pour compiler). La partie que j'ai ajoutée à la fin ( v & = ~ ~ (1 << r); code> était incorrect et causant l'erreur en raison de problèmes signés / non signés, et le fait que
v code> est changé au milieu de la fonction. Voir mon édition pour une réponse corrigée. J'ai la main vérifiée qu'il donne la bonne réponse dans le cas de l'OP, et vous pouvez lire l'article pour voir pourquoi il est correct mathématiquement = P
@ L.b.: D'accord, je suis sorti du mode copier-coller et corrigé ma réponse :) Mais cet article est toujours une excellente ressource, donc j'ai laissé cette partie dans
Si vous allez prendre cela comme integet, le code du résultat sera toujours affiché sans avoir la manipulation de zéro. Utilisation de chaîne qui sera quelque chose comme ci-dessous:
La question est clairement marquée bit-manipulation code> donc il est donc clair que ce que veut l'OP, est une vitesse. Bien que le résultat de votre réponse soit correct, ce faisant en convertissant de
int code> à
string code> détruit le but initial de la question.
int x = 0xD; //01101 int wk = x; int mask = 1; while(0!=(wk >>= 1)) mask <<= 1; x ^= mask; //00101
Inspiré de la réponse de Merlyn Morgan-Graham
static uint fxn(uint v) { uint i = v; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; return (v >> 1) & i; }
Vous pouvez utiliser quelque chose comme ce qui suit (non testé):
Si vous connaissez la taille du type, vous pouvez déplacer les bits. Vous pouvez également aussi facilement le mettre dans un bitparray et renversez le MSB.
Exemple 1: P>
short value = -5334; var newValue = Convert.ToInt16((value << 1) >> 1); // Or newValue = Convert.ToUInt16(value);
Que voulez-vous dire par "1 premier sur 0"?
Effectuez logique et fonctionnement comme 01101 et 01101 = 01101
Je crois que la question est la suivante: "Traverser le bit entier par un peu. La première fois que vous rencontrez un 1, changez-le à zéro. Laissez tout ce qui est inchangé."
Quel est le type de votre "bit-conteneur"? int, long, chaîne ...?