Эквивалент `IF ( X AND ( 2 ^ Y )) then ` в C#
-
03-07-2019 - |
Вопрос
у меня есть это If
состояние в VB6
If ( X AND ( 2 ^ Y)) Then
a = a + " 1"
Else
a = a + " 0"
Мне нужен тот же эквивалент на С#
Я пробовал делать как
if ( X && ( 2 ^ Y)) // ERROR: && can not be used between int to int
a = a + "1";
else
a = a + "0";
но эта штука выдает мне ошибку.
Вот мой полный код VB, который я хочу преобразовать в С#.
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
В приведенном выше коде intNumber
может быть любое число.
Решение
Примечание:Этот ответ был сильно отредактирован из-за отсутствия информации в исходном вопросе.Эта версия ответа теперь основана на обновленном вопросе с достаточным количеством информации.Для истории проверьте журнал изменений.
Две вещи:
&&
используется между логическими выражениями для определения логического И-значения^
в C# означает XOR, а не возведение в степень.Вы не задавали вопрос об этом, но вы неизбежно обнаружили, что^
похоже, не выполнял свою работу.
А &&
легко обрабатывается, так как его можно заменить одним &
вместо этого это имеет двойное значение, в зависимости от контекста.Либо это логический оператор И с полной оценкой (&&
является короткозамкнутым), или это побитовый оператор, что вам здесь и нужно.
А ^
все же другое.Самый прямой эквивалент Математика.Pow, но в этом случае доступна лучшая альтернатива — битовый сдвиг.
Случай 2^X
можно рассматривать как сдвинуть 1-битные позиции X влево, и сдвинуть биты влево есть свой оператор <<
оператор.
Так 2^X
можно заменить на 1 << X
.
В этом контексте вот что вам нужно для вашего самого внутреннего оператора if:
if ((intNumber & (1 << index)) != 0)
a = a + "1";
else
a = a + "0";
Подключите это к циклу, как в нижнем примере, и вы получите следующее:
for (Int32 index = 7; index >= 0; index--)
if ((intNumber & (1 << index)) != 0)
bin = bin + "1";
else
bin = bin + "0";
Теперь объединение строк, подобных этой, создает нагрузку на GC, поэтому вам, вероятно, следует либо сохранить эти цифры в Char
массив, а затем создайте строку или используйте класс StringBuilder.В противном случае вы создадите 8 (из моего примера) строк разного размера и будете использовать и сохранять только последнюю.В зависимости от обстоятельств это может не представлять проблемы, но если вы вызываете этот код много раз, он будет складываться.
Вот улучшенная версия окончательного кода:
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);
Однако и вот в чем интерес.В .NET уже существует способ преобразовать значение Int32 в строку, полную двоичных цифр, и это метод Convert.ToString.Единственное отличие состоит в том, что при этом не добавляются ведущие нули, поэтому нам придется сделать это самостоятельно.
Итак, вот окончательный код, который вы должны использовать:
String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');
Это заменяет весь цикл.
Другие советы
Похоже, что в этом случае VB используется для побитового И, так что, возможно:
if ( (1 & ( 2 ^ 1)) != 0)
Однако это константа!Вы уверены, что где-то там нет переменной?
2^1 равно 3;1 и 3 — это 1;так что это всегда будет правдой
(по крайней мере, в C#, где ^ — это XOR;Мне сказали, что в VB ^ — это СИЛА, поэтому 2 ^ 1 — это 2;1 и 2 — 0;так что это всегда будет ложью...)
Я не понимаю условный синтаксис...Вы имеете в виду 1 & (2 ^ 1))?(Для поразрядных сравнений используйте только один амперсанд!) (но это константа!)
Но если a - это строка, то
a += Conditional? "1": "0";
Пытаться
if ( 1 & ( 2 ^ 1))
a = a + "1";
else
a= a+ "0";
Не используйте короткое замыкание и.Попробуй это:
if (1 & (2 ^ 1) == 1)
{
a = a + "1";
}
else
{
a = a + "0";
}
Ваш пост не имеет никакого смысла:
IF ( 1 AND ( 2 ^ 1)) Then
a = a + " 1"
Else
a = a + " 0"
2^1 = 2 = Math.pow (2,1) 1 и 2 = 1 и 2 = 0
Эта логика означает, что результат if всегда будет нулевым.
Если я правильно понимаю, что вы хотите сделать, это в цикле сделать
if i is even
a = a + "0"
else
a = a+"1"
в данном случае было бы лучше, если бы ты просто написал
for (int i=7;i>=0;i--)
{
bin+=(i % 2).ToString();
}
также для объединения строк в цикле вы должны использовать класс StringBuilder, а не оператор +.
Для справки, более краткая версия окончательного кода Лассе:
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);
По сути, это использует тот факт, что мы можем так же легко сдвинуть число вправо, как и сдвинуть маску влево.Если мы поступим таким образом, результатом операции И всегда будет цифра единиц, которая является той же цифрой, которую мы хотим использовать в нашей строке, поэтому мы просто преобразуем ее в символ ASCII, добавляя «0» (или 48, или 0x30). .