Question

J'ai un vieux code comme celui-ci:

private int ParseByte(byte theByte)
{
        byte[] bytes = new byte[1];
        bytes[0] = theByte;
        BitArray bits = new BitArray(bytes);

        if (bits[0])
            return 1;
        else
            return 0;
}

C'est long et je me suis dit que je pouvais le réduire comme ceci:

private int ParseByte(byte theByte)
{
         return theByte >> 7;
}

Mais je ne reçois pas les mêmes valeurs que la première fonction. L'octet contient 00000000 ou 10000000. Qu'est-ce qui me manque ici? Est-ce que j'utilise un opérateur incorrect?

Était-ce utile?

La solution

Le problème est que, dans la première fonction, les bits [0] renvoient le bit le moins significatif, alors que la seconde fonction renvoie le bit le plus significatif. Pour modifier la deuxième fonction afin d’obtenir le bit le moins significatif:

private int ParseByte(byte theByte)
{
    return theByte & 00000001;
}

Pour modifier la première fonction afin de renvoyer le bit de poids fort, vous devez utiliser les bits [7] et non les bits [0].

Autres conseils

La fonction équivalente au premier fragment est:

return theByte & 1 == 1

Dans le deuxième fragment, vous étiez le bit le plus significatif et dans le premier, le moins significatif.

Voulez-vous renvoyer int ou string? Quoi qu’il en soit, vous pouvez utiliser modulo:

return theByte % 2 == 0 ? "0" : "1"

OK, vous avez modifié ... et souhaitez renvoyer int

Un mot sur votre opération de changement de vitesse: vous devriez utiliser < < au lieu de > > ;. Mais ceci retourne (lorsque vous convertissez en octet au lieu de int) 0 ou 128 et non 0 ou 1. Vous pouvez donc réécrire votre deuxième solution comme suit:

return (byte)(theByte << 7) == 128 ? 1 : 0;

Mais les autres réponses contiennent des solutions vraiment meilleures que celle-ci.

Peut-être que la première fonction devrait vérifier les bits [7]?

Vous avez un zéro supplémentaire dans vos nombres binaires (vous avez 9 chiffres dans chacun). Je suppose que c'est juste une faute de frappe.

Êtes-vous sûr de commander correctement? Le binaire est traditionnellement écrit de droite à gauche et non de gauche à droite comme la plupart des autres systèmes de numérotation. Si le nombre binaire que vous avez indiqué est une propriété formatée (ce qui signifie que 10000000 est vraiment le nombre 128 et non le nombre 1), votre premier extrait de code ne devrait pas fonctionner et le second devrait. Si vous écrivez à l'envers (ce qui signifie theByte & 1 est & et non <=>), vous n'avez même pas besoin de bitshift. Juste ET avec 1 (<=>).

En fait, quelle que soit l’approche choisie, AND (l’opérateur <=>) semble plus approprié. Étant donné que votre première fonction fonctionne et que la seconde ne fonctionne pas, je suppose que vous écrivez simplement le nombre à l'envers et que vous avez besoin de l'ET AND avec 1 comme décrit ci-dessus.

Selon un utilisateur de site de Microsoft BitArray stocke en interne les bits dans Int32s en big endian par ordre de bits. Cela pourrait causer le problème. Pour une solution et de plus amples informations, vous pouvez visiter le lien.

1st La première fonction ne fonctionne pas car elle essaie de retourner une chaîne au lieu d'un int.

Mais vous voudrez peut-être ceci:

    private static int ParseByte(byte theByte)
    {
        return theByte & 1;
    }

Cependant, vous voudrez peut-être aussi ceci:

    private static string ParseByteB(byte theByte)
    {
        return (theByte & 1).ToString();
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top