Pregunta

tengo esto If condición en VB6

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

Quiero el mismo equivalente en C#

Intenté hacer como

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

pero esto me está dando un error.

Aquí está mi código VB completo que quiero convertir a 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

En el código anterior intNumber podría ser cualquier número.

¿Fue útil?

Solución

Nota:Esta respuesta ha sido editada en gran medida debido a la falta de información en la pregunta original.Esta versión de la respuesta ahora se basa en la pregunta actualizada con suficiente información.Para conocer el historial, consulte el registro de edición.

Dos cosas:

  • && se utiliza entre expresiones booleanas para determinar el valor AND lógico
  • ^ en C# significa XOR, no elevado a la potencia de.No hiciste una pregunta sobre esto pero fue inevitable que descubrieras que ^ no parecía estar haciendo su trabajo.

El && es de fácil manejo, ya que se puede sustituir por un solo & en cambio, que tiene un doble significado, según el contexto.O es un operador AND lógico de evaluación completa (&& es uno en cortocircuito), o es un operador bit a bit, que es lo que desea aquí.

El ^ Aunque es diferente.El equivalente más directo es Matemáticas.Pow, pero en este caso, hay disponible una alternativa mejor: bit-shift.

El caso de 2^X se puede pensar como desplazar las posiciones X de 1 bit a la izquierda, y desplazar bits a la izquierda tiene su propio operador, el << operador.

Entonces 2^X se puede reemplazar con 1 << X.

En este contexto, esto es lo que desea para su declaración if más interna:

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

Conéctelo a un bucle como el que tiene en el ejemplo inferior y obtendrá esto:

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

Ahora, concatenar cadenas como esta genera presión en el GC, por lo que probablemente deberías almacenar estos dígitos en un Char matriz y construir la cadena después, o usar la clase StringBuilder.De lo contrario, crearás 8 (de mi ejemplo) cadenas de diferentes tamaños y solo usarás y conservarás la última.Dependiendo de las circunstancias, esto puede no suponer un problema, pero si llamas a este código muchas veces, se acumulará.

Aquí hay una mejor versión del código 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);

Sin embargo, aquí está el truco.Ya existe una forma de convertir un valor Int32 en una cadena llena de dígitos binarios en .NET, y es el método Convert.ToString.La única diferencia es que no agrega ceros a la izquierda, por lo que tenemos que hacerlo nosotros mismos.

Entonces, aquí está el código final que deberías usar:

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

Esto reemplaza todo el bucle.

Otros consejos

Parece que está usando VB para hacer bit a bit Y en este caso, entonces quizás:

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

Sin embargo, esto es una constante! ¿Estás seguro de que no hay una variable en alguna parte?

2 ^ 1 es 3; 1 & Amp; 3 es 1; así que esto siempre sería cierto

(al menos, bajo C #, donde ^ es XOR; me dicen que en VB ^ es POWER, entonces 2 ^ 1 es 2; 1 & amp; 2 es 0; así que esto siempre sería falso. ..)

No entiendo la sintaxis condicional ... ¿Te refieres a 1 & amp; (2 ^ 1))? (¡Use solo un ampersand para comparaciones bit a bit!) (¡Pero esto es constante!)

pero si a es una cadena,  entonces

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

Probar

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

No utilice el cortocircuito y. Prueba esto:

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

Tu publicación no tiene ningún sentido:

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

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

Esta lógica significa que el resultado del if siempre será cero.

Si entiendo correctamente lo que quieres hacer es hacer un bucle hacer

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

en este caso sería mejor si escribieras

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

también para la concatenación de cadenas en bucle, debe usar la clase StringBuilder, no el operador +.

Solo como referencia, una versión más concisa del código 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);

Básicamente, esto aprovecha el hecho de que podemos cambiar fácilmente el número a la derecha como desplazar la máscara a la izquierda. Si hacemos las cosas de esa manera, el resultado de la operación AND es siempre el dígito de las unidades, que es el mismo dígito que queremos en nuestra cadena, por lo que simplemente lo convertimos en un carácter ASCII agregando '0' (o 48 o 0x30) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top