Question

J'ai cette If condition dans VB6

If ( X AND ( 2 ^ Y)) Then 
  a = a + " 1" 
Else
  a = a + " 0" 

Je veux le même équivalent en C #

j'ai essayé de faire comme

if ( X && ( 2 ^ Y))   // ERROR: && can not be used between int to int
  a = a + "1";
else
  a = a + "0";

mais cette chose me donne une erreur.

Voici mon code VB complet que je veux convertir en C #

For i = 7 To 0 Step -1
        If intNumber And (2 ^ i) Then   ' Use the logical "AND" operator.
            bin = bin + "1"
        Else
            bin = bin + "0"
        End If
    Next

Dans le code ci-dessus intNumber, il peut s'agir de n'importe quel nombre.

Était-ce utile?

La solution

Remarque : cette réponse a été considérablement modifiée en raison du manque d'informations dans la question d'origine. Cette version de la réponse est maintenant basée sur la question mise à jour avec suffisamment d'informations. Pour l'historique, consultez le journal des modifications.

Deux choses:

  • && est utilisé entre les expressions booléennes pour déterminer la valeur AND logique
  • ^ en C # signifie XOR, pas élevé au pouvoir. Vous n'avez pas posé de question à ce sujet, mais il était inévitable que vous ayez découvert que & ne semblait pas faire son travail.

Le 2^X est facile à manipuler puisqu'il peut être remplacé par un seul << qui a une double signification, en fonction du contexte. Soit il s’agit d’un opérateur AND logique qui effectue une évaluation complète (1 << X est un court-circuit), ou c’est un opérateur au niveau du bit, comme vous le souhaitez ici.

Le Char est différent cependant. L’équivalent le plus direct est Math.Pow . dans ce cas, une meilleure alternative est disponible, bit-shift.

Le cas de <=> peut être considéré comme un décalage des positions 1 bits X vers la gauche et un décalage des bits vers la gauche ayant son propre opérateur, l'opérateur <=>.

Ainsi, <=> peut être remplacé par <=>.

Dans ce contexte, voici ce que vous voulez pour votre déclaration if la plus interne:

if ((intNumber & (1 << index)) != 0)
    a = a + "1";
else
    a = a + "0";

Branchez-le dans une boucle comme dans l’exemple ci-dessous, et vous obtenez ceci:

for (Int32 index = 7; index >= 0; index--)
    if ((intNumber & (1 << index)) != 0)
        bin = bin + "1";
    else
        bin = bin + "0";

Maintenant, la concaténation de chaînes comme celle-ci génère une pression GC. Par conséquent, vous devriez probablement stocker ces chiffres dans un tableau <=>, puis construire la chaîne, ou utiliser la classe StringBuilder. Sinon, vous allez construire 8 (d'après mon exemple) des chaînes de tailles différentes et vous n'utiliserez que la dernière. Selon les circonstances, cela ne posera peut-être pas problème, mais si vous appelez ce code plusieurs fois, le résultat sera cumulatif.

Voici une meilleure version du code final:

Char[] digits = new Char[8]; // change if you want more/fewer digits
for (Int32 index = 0; index < digits.Length; index++)
    if ((intNumber & (1 << index)) != 0)
        digits[digits.Length - 1 - index] = '1';
    else
        digits[digits.Length - 1 - index] = '0';
bin = new String(digits);

Cependant, et voici le kicker. Il existe déjà un moyen de convertir une valeur Int32 en une chaîne de chiffres binaires dans .NET, il s'agit de la méthode Convert.ToString. La seule différence est qu’il n’ajoute pas de zéros à gauche, nous devons donc le faire nous-mêmes.

Alors, voici le code final que vous devriez utiliser:

String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');

Ceci remplace la boucle entière.

Autres conseils

On dirait qu'il utilise VB pour effectuer des opérations binaires ET dans ce cas, alors peut-être:

if ( (1 & ( 2 ^ 1)) != 0)

Cependant, c'est une constante! Êtes-vous sûr qu'il n'y a pas de variable quelque part?

2 ^ 1 est 3; 1 & Amp; 3 est 1; donc ce serait toujours vrai

(au moins, sous C #, où ^ est XOR; on me dit que dans VB ^ est POWER, donc 2 ^ 1 est 2; 1 & et 2 est égal à 0; cela serait donc toujours faux. ..)

Je ne comprends pas la syntaxe conditionnelle ... Voulez-vous dire 1 & amp; (2 ^ 1))? (Utilisez seulement une esperluette pour les comparaisons entre bits!) (Mais ceci est constant!)

mais si a est une chaîne,  alors

 a +=  Conditional?  "1": "0";

Essayez

if ( 1 & ( 2 ^ 1))
  a = a + "1";
else
  a= a+ "0";

N'utilisez pas le court-circuit et. Essayez ceci:

if (1 & (2 ^ 1) == 1)
{
    a = a + "1";
}
else
{
    a = a + "0";
}

Votre message n'a aucun sens:

IF ( 1 AND ( 2 ^ 1)) Then 
 a = a + " 1" 
Else
  a = a + " 0"

2 ^ 1 = 2 = Math.Pow (2,1) 1 AND 2 = 1 & Amp; 2 = 0

Cette logique signifie que le résultat du if sera toujours zéro.

Si je comprends bien ce que vous voulez faire est de le faire en boucle

if i is even
a = a + "0"
else
a = a+"1"

dans ce cas, il serait préférable que vous écriviez juste

for (int i=7;i>=0;i--)
{
   bin+=(i % 2).ToString();
}

également pour la concaternation de chaînes en boucle, vous devez utiliser la classe StringBuilder, opérateur non +.

Juste pour référence, une version plus concise du code final de Lasse:

Char[] digits = new Char[8]; // change if you want more/fewer digits
int index = digits.Length;
var x = intNumber;
do {
    digits[--index] = '0' + (x & 1);
    x >>= 1;
} while (index);
bin = new String(digits);

En gros, cela tire parti du fait que nous pouvons tout aussi facilement décaler le nombre à droite que décaler le masque à gauche. Si nous faisons les choses de cette façon, le résultat de l'opération AND est toujours le chiffre, qui est le même chiffre que celui que nous voulons dans notre chaîne. Nous le convertissons donc simplement en caractère ASCII en ajoutant '0' (ou 48 ou 0x30) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top