72 votes

Convertir un int en un tableau de bits en .NET

Comment puis-je convertir un int en un tableau de bits ?

Si j'ai par exemple un int avec la valeur 3, je veux un tableau qui a la longueur 8 et qui ressemble à ceci :

0 0 0 0 0 0 1 1

Chacun de ces nombres se trouve dans un emplacement séparé du tableau qui a la taille 8.

0 votes

Attends, tu veux convertir le int à un byte ou un bit-array ?

0 votes

Un octet contient 8 bits, donc oui, je veux un tableau qui contient 8 bits, un dans chaque emplacement.

0 votes

Voulez-vous un tableau de true / false ou un tableau de chars rempli avec l'une ou l'autre des valeurs suivantes 1 o 2 ?

101voto

Sven Points 10540

Utilisez le BitArray classe.

int value = 3;
BitArray b = new BitArray(new int[] { value });

Si vous voulez obtenir un tableau pour les bits, vous pouvez utiliser la fonction BitArray.CopyTo avec une méthode bool[] le tableau.

bool[] bits = new bool[b.Count];
b.CopyTo(bits, 0);

Notez que les bits seront stockés du moins significatif au plus significatif, vous pouvez donc utiliser la fonction Array.Reverse .

Et enfin, si vous voulez obtenir des 0 et des 1 pour chaque bit au lieu des booléens (j'utilise un byte pour stocker chaque bit, ce qui est moins coûteux qu'une carte à puce. int ):

byte[] bitValues = bits.Select(bit => (byte)(bit ? 1 : 0)).ToArray();

61voto

Maxim Points 1903

Pour convertir l'int 'x'.

int x = 3;

D'une part, par une manipulation sur l'int :

string s = Convert.ToString(x, 2); //Convert to binary in a string

int[] bits= s.PadLeft(8, '0') // Add 0's from left
             .Select(c => int.Parse(c.ToString())) // convert each char to int
             .ToArray(); // Convert IEnumerable from select to Array

Alternativement, en utilisant la classe BitArray-

BitArray b = new BitArray(new byte[] { x });
int[] bits = b.Cast<bool>().Select(bit => bit ? 1 : 0).ToArray();

3 votes

Merci ! J'ai fini par obtenir ce code : string s = Convert.ToString(number, 2) ; char[] bits = s.PadLeft(8, '0').ToCharArray() ;

0 votes

Et si vous voulez que les résultats soient des booléens ?

0 votes

@AaronFranke le BitArray vous donne la sortie sous forme de booléens.

18voto

Tjekkles Points 1116

Utilisez Convert.ToString (value, 2)

donc dans votre cas

string binValue = Convert.ToString (3, 2);

3 votes

Et puis .ToCharArray() puisqu'il veut un tableau.

1 votes

En effet, pour le tableau utiliser .ToCharArray(), j'ai lu trop vite :p

7voto

Je le ferais en une seule ligne comme indiqué ci-dessous :

using System;
using System.Collections;

namespace stackoverflowQuestions
{
    class Program
    {
        static void Main(string[] args)
        {    
            //get bit Array for number 20
            var myBitArray = new BitArray(BitConverter.GetBytes(20));
        }
    }
}

Veuillez noter que chaque élément d'un BitArray est stocké en tant que bool comme indiqué dans l'image ci-dessous :

enter image description here

Le code ci-dessous fonctionne donc :

if (myBitArray[0] == false)
{
    //this code block will execute
}

mais le code ci-dessous ne compile pas du tout :

if (myBitArray[0] == 0)
{
    //some code
}

0 votes

C'est certainement la meilleure solution à ce problème. Le constructeur de BitArray reçoit un paramètre de ByteArray. Nous pouvons donc utiliser Encoding.UTF8.GetBytes("hello world") ou toute autre donnée.

6voto

Capt. Rochefort Points 47

Je viens de tomber sur un cas où...

int val = 2097152;
var arr = Convert.ToString(val, 2).ToArray();
var myVal = arr[21];

...n'a pas donné les résultats que je recherchais. Dans 'myVal' ci-dessus, la valeur stockée dans le tableau en position 21 était '0'. Elle aurait dû être un '1'. Je ne suis pas sûr de la raison pour laquelle j'ai reçu une valeur inexacte et cela m'a déconcerté jusqu'à ce que je trouve un autre moyen en C# de convertir un INT en un tableau de bits :

int val = 2097152;
var arr = new BitArray(BitConverter.GetBytes(val));
var myVal = arr[21];

Le résultat obtenu est 'true' comme valeur booléenne pour 'myVal'.

Je me rends compte que ce n'est peut-être pas la manière la plus efficace d'obtenir cette valeur, mais c'était très direct, simple et lisible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X