Equivalente a `if (x e (2 ^ y)) então` em c#
-
03-07-2019 - |
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.
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) .