VB6 Побитовый И преобразованный в C# как логический результат

Если у меня есть в VB6:

GetBit = 414 And 2 ^ 0

GetBit будет равен false, потому что возвращаемый тип функции - логический. Я не уверен, как vb6 подходит к false хотя?

Как я могу преобразовать это в C#?

long longResult = 0;
longResult = 414 & 2 ^ 0;

return Convert.ToBoolean(longResult);

^ Приведенный выше код C# возвращает мне значение true, где longResult равно 2. Я понимаю, как рассчитывается 2, но я не уверен, как / почему возвращается значение false в коде vb6?

2 ответа

Решение

Оператор ^ в Basic это Math.Pow(). Таким образом, в VB6 он оценивается как 414 & Math.Pow(2, 0) == 0x19E & 1 = 0 == False. Обратите внимание, что повышение целочисленного литерала до степени 0 не очень полезно, результат всегда равен 1.

В C# оператор ^ - это оператор XOR, а не одно и то же. Просто используйте 1.

Более пристальное внимание, безусловно, оправдано. Это не тот код, который вы хотели бы слепо транслитерировать, приличные шансы, что вы просто воспроизводите ошибку.


Так что на самом деле код выглядит так: long result = firstParam & Math.Pow(2, secondParam);

Имейте в виду, что Long в VB6 это 32-разрядное целое число, вы хотите int в C#. И вы действительно не хотите использовать математику с плавающей точкой. Правильное преобразование это:

  int result = firstParam & (1 << secondParam);

Обновление: я полностью упустил из виду, что ^ в C# это XOR, а не Pow(), очень неловко. Я решил оставить свой ответ, потому что решение VB6 все еще корректно, и из-за двух ссылок на страницы с приоритетами оператора.

Исходное сообщение: Классическая проблема приоритета операторов;-) C# и VB6 имеют различия в этом.

В VB6 побитовые операторы имеют более низкий приоритет, чем арифметические операторы, см. Приоритет оператора в Visual Basic. Итак, что происходит, 2 ^ 0 оценивается как 1, а 414 А 1 равно 0.

Решение получить True это:

GetBit = (414 And 2) ^ 0

Для полноты вы можете найти здесь приоритеты оператора C#. Оказывается, & только на один шаг выше, чем ^ в C#.

Другие вопросы по тегам