Вопрос

у меня есть это 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). .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top