Equivalente di `IF (X AND (2 ^ Y)) Then` in C #
-
03-07-2019 - |
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.
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) .