6
votes

Comment effacer le bit le plus significatif?

Comment puis-je changer le bit le plus significatif dans un int de 1 à 0? Par exemple, je veux changer 01101 à 0101.


4 commentaires

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 ...?


7 Réponses :


-1
votes

Le moyen le plus simple de faire des opérations bitwises, comme celui-ci consiste à utiliser l'opérateur de quart de vitesse gauche (<<).

(1 << 3) = 100b , (1 << 5) = 10000B

alors vous utilisez une valeur dans laquelle Vous voulez changer un certain peu et utiliser
| (Ou) si vous voulez le changer à un 1 ou de
& ~ (Et non) si vous voulez le changer à un 0.

comme ceci: xxx


4 commentaires

(1 << 3) = 8, (1 << 5) = 32


@ 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 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.



10
votes

Modifier: Réponse simplifiée (et expliquée) forte>

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> xxx pré>

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


8 commentaires

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); était incorrect et causant l'erreur en raison de problèmes signés / non signés, et le fait que v 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



-3
votes

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: XXX


1 commentaires

La question est clairement marquée bit-manipulation 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 à string détruit le but initial de la question.



0
votes
int x = 0xD; //01101
int wk = x;
int mask = 1;
while(0!=(wk >>= 1)) mask <<= 1;
x ^= mask; //00101

0 commentaires

3
votes

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;
}


0 commentaires

2
votes

Vous pouvez utiliser quelque chose comme ce qui suit (non testé): xxx


0 commentaires

0
votes

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);


0 commentaires