Domanda

Ho questa If condizione in VB6

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

Voglio lo stesso equivalente in C #

Ho provato a fare come

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

ma questa cosa mi sta dando un errore.

Ecco il mio codice VB completo che voglio convertire in 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

Nel codice sopra intNumber potrebbe essere qualsiasi numero.

È stato utile?

Soluzione

Nota : questa risposta è stata pesantemente modificata a causa della mancanza di informazioni nella domanda originale. Questa versione della risposta è ora basata sulla domanda aggiornata con informazioni sufficienti. Per la cronologia, controlla il registro delle modifiche.

Due cose:

  • && viene utilizzato tra espressioni booleane, per determinare il valore AND logico
  • ^ in C # significa XOR, non elevato alla potenza di. Non hai fatto una domanda al riguardo, ma è inevitabile che tu abbia scoperto che & non sembrava fare il suo lavoro.

Il 2^X è facilmente gestibile, poiché può essere sostituito con un singolo <<, che ha un doppio significato, a seconda del contesto. O è un operatore logico AND a valutazione completa (1 << X è un cortocircuito) oppure è un operatore bit a bit, che è quello che vuoi qui.

Il Char è diverso però. L'equivalente più diretto è Math.Pow , ma in questo caso, è disponibile un'alternativa migliore, bit-shift.

Il caso di <=> può essere considerato come sposta le posizioni X a 1 bit verso sinistra e sposta i bit verso sinistra ha il suo operatore, l'operatore <=>.

Quindi <=> può essere sostituito con <=>.

In questo contesto, ecco cosa vuoi per la tua dichiarazione if più intima:

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

Inseriscilo in un loop come hai nell'esempio in basso, e ottieni questo:

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

Ora, concatenare stringhe come questa genera pressione GC, quindi dovresti probabilmente memorizzare queste cifre in un array <=> e costruire la stringa in seguito, oppure usare la classe StringBuilder. Altrimenti costruirai 8 (dal mio esempio) stringhe di dimensioni diverse e utilizzerai e manterrai solo l'ultima. A seconda delle circostanze, ciò potrebbe non costituire un problema, ma se si chiama questo codice più volte, verrà aggiunto.

Ecco una versione migliore del codice finale:

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

Tuttavia, ed ecco il kicker. Esiste già un modo per convertire un valore Int32 in una stringa piena di cifre binarie in .NET ed è il metodo Convert.ToString. L'unica differenza è che non aggiunge alcun zero iniziale, quindi dobbiamo farlo da soli.

Quindi, ecco il codice finale che dovresti usare:

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

Questo sostituisce l'intero ciclo.

Altri suggerimenti

Sembra che stia usando VB per fare bit a bit in questo caso, quindi forse:

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

Tuttavia, questa è una costante! Sei sicuro che non ci sia una variabile lì dentro da qualche parte?

2 ^ 1 è 3; 1 & Amp; 3 è 1; quindi questo sarebbe sempre vero

(almeno, sotto C #, dove ^ è XOR; mi è stato detto che in VB ^ è POTENZA, quindi 2 ^ 1 è 2; 1 & amp; 2 è 0; quindi questo sarebbe sempre falso. ..)

Non capisco la sintassi condizionale ... Intendi 1 & amp; (2 ^ 1))? (Usa solo una e commerciale per i confronti bit a bit!) (Ma questo è costante!)

ma se a è una stringa,  quindi

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

Prova

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

Non usare il corto circuito e. Prova questo:

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

Il tuo post non ha alcun senso:

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

Questa logica significa che il risultato di if sarà sempre zero.

Se capisco correttamente che cosa vuoi fare è in un ciclo fare

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

in questo caso sarebbe meglio se tu scrivessi

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

anche per la concaternazione di stringhe in loop dovresti usare la classe StringBuilder non + operatore.

Solo per riferimento, una versione più concisa del codice finale di 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);

Fondamentalmente, questo sfrutta il fatto che possiamo semplicemente spostare il numero a destra come spostare la maschera a sinistra. Se facciamo le cose in quel modo, il risultato dell'operazione AND è sempre la cifra che è la stessa cifra che vogliamo nella nostra stringa, quindi la convertiamo semplicemente in un carattere ASCII aggiungendo '0' (o 48 o 0x30) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top