Pergunta

eu tenho isto If Condição em VB6

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

Eu quero o mesmo equivalente em C#

Eu tentei fazer como

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

Mas essa coisa está me dando um erro.

Aqui está o meu código VB completo que eu quero converter em 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

No código acima intNumber pode ser qualquer número.

Foi útil?

Solução

Observação: Esta resposta foi fortemente editada devido à falta de informações na pergunta original. Esta versão da resposta agora é baseada na pergunta atualizada com informações suficientes. Para histórico, verifique o log de edição.

Duas coisas:

  • && é usado entre expressões booleanas, para determinar o lógico e o valor
  • ^ Em C# significa xor, não criado para o poder. Você não fez uma pergunta sobre isso, mas era inevitável que você tenha descoberto que ^ Não parecia estar fazendo seu trabalho.

o && é facilmente tratado, pois pode ser substituído por um único & Em vez disso, que tem um significado duplo, dependendo do contexto. Ou é um lógico e operador de avaliação total (&& é um curto-circuito), ou é um operador um bit, que é o que você deseja aqui.

o ^ é diferente. O equivalente mais direto é Math.pow, mas, neste caso, uma alternativa melhor está disponível, deslocamento de bits.

O caso de 2^X pode ser pensado como mude as posições x de 1 bit para a esquerda, e troca de bits para a esquerda tem seu próprio operador, o << operador.

Então 2^X pode ser substituído por 1 << X.

Nesse contexto, aqui está o que você deseja para sua estatura mais interior:

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

Conecte -o a um loop como você tem em seu exemplo inferior, e você entende:

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

Agora, concatenando strings como esta gera pressão GC, então você provavelmente deve armazenar esses dígitos em um Char Array e construa a string posteriormente ou use a classe StringBuilder. Caso contrário, você vai acumular 8 (do meu exemplo) strings de tamanho diferente, e você só usará e manterá o último. Dependendo das circunstâncias, isso pode não representar um problema, mas se você chamar esse código muitas vezes, ele aumentará.

Aqui está uma versão melhor do 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);

No entanto, e aqui está o kicker. Já existe uma maneira de converter um valor int32 em uma sequência cheia de dígitos binários no .NET, e é o método convert.toString. A única diferença é que ele não adiciona zeros líderes, por isso temos que fazer isso nós mesmos.

Então, aqui está o código final que você deve usar:

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

Isso substitui todo o loop.

Outras dicas

Parece que está usando o VB para fazer bit e, neste caso, então talvez:

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

No entanto, isso é uma constante! Tem certeza de que não há uma variável lá em algum lugar?

2 ^ 1 é 3; 1 e 3 é 1; Então isso sempre seria verdade

(Pelo menos, em C#, onde ^ é xor; me disseram que em Vb ^ é poder, então 2 ^ 1 é 2; 1 & 2 é 0; então isso sempre seria falso ...)

Eu não entendo a sintaxe condicional ... você quer dizer 1 e (2 ^ 1))? (Use apenas um ampersa e para comparações bit -net!) (Mas isso é constante!)

Mas se A é uma string, então

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

Tentar

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

Não use o curto -circuito e. Experimente isso:

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

Sua postagem não faz sentido:

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

2^1 = 2 = Math.pow (2,1) 1 e 2 = 1 e 2 = 0

Essa lógica significa que o resultado do IF sempre será zero.

Se eu entendi corretamente o que você quer fazer é em um loop fazer

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

Nesse caso, seria melhor se você apenas escrevesse

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

Também para concaternação de string no loop, você deve usar a classe StringBuilder Not + Operator.

Apenas para referência, uma versão mais concisa do 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);

Basicamente, isso tira proveito do fato de que podemos mudar com facilidade o número para a direita da maneira que a máscara foi para a esquerda. Se fizermos as coisas dessa maneira, o resultado da operação e é sempre o dígito, que é o mesmo dígito que queremos em nossa string, então apenas convertemos em um caractere ASCII adicionando '0' (ou 48 ou 0x30) .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top