Как использовать оператор & в C #?Правильный ли перевод кода?

StackOverflow https://stackoverflow.com/questions/685436

Вопрос

строка "if(arg2 & 1)" в C ++ (arg2 - это DWORD) равна "if(arg2 & 1==0)" в C #(arg2 - это Uint32), верно?

Я пытаюсь перевести функцию с C ++ на C #, но получаю сообщение об ошибке:

Operator '&' cannot be applied to operands of type 'uint' and 'bool'

Я был бы также благодарен, если бы вы могли подробнее ознакомиться со всей функцией на предмет любых других ошибок.

C++

DWORD Func_X_4(DWORD arg1, DWORD arg2, DWORD arg3)
{
LARGE_INTEGER result = {1, 0};
LARGE_INTEGER temp1 = {0};
LARGE_INTEGER temp2 = {0};
LARGE_INTEGER temp3 = {0};
LARGE_INTEGER temp4 = {0};
for(int x = 0; x < 32; ++x)
{
    if(arg2 & 1)
    {
        temp1.LowPart = arg3;
        temp1.HighPart = 0;
        temp2.QuadPart = temp1.QuadPart * result.QuadPart;
        temp3.LowPart = arg1;
        temp3.HighPart = 0;
        temp4.QuadPart = temp2.QuadPart % temp3.QuadPart;
        result.QuadPart = temp4.QuadPart;
    }
    arg2 >>= 1;
    temp1.LowPart = arg3;
    temp1.HighPart = 0;
    temp1.QuadPart *= temp1.QuadPart;
    temp2.LowPart = arg1;
    temp2.HighPart = 0;
    temp3.QuadPart = temp1.QuadPart % temp2.QuadPart;
    arg3 = temp3.LowPart;
    if(!arg2)
        break;
}
return result.LowPart;
}

Преобразован в C#

Структура LARGE_INTEGER:

[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct LARGE_INTEGER
{
    [FieldOffset(0)]
    public Int64 QuadPart;
    [FieldOffset(0)]
    public UInt32 LowPart;
    [FieldOffset(4)]
    public Int32 HighPart;
}

Функция:

public static UInt32 X4(UInt32 arg1, UInt32 arg2, UInt32 arg3)
    {
        LARGE_INTEGER result = new LARGE_INTEGER();
        result.LowPart = 1;
        result.HighPart = 0;
        LARGE_INTEGER temp1 = new LARGE_INTEGER();
        LARGE_INTEGER temp2 = new LARGE_INTEGER();
        LARGE_INTEGER temp3 = new LARGE_INTEGER();
        LARGE_INTEGER temp4 = new LARGE_INTEGER();
        for (int x = 0; x < 32; ++x)
        {
            if (arg1 & 1 ==0)
            {
                temp1.LowPart = arg3;
                temp1.HighPart = 0;
                temp2.QuadPart = temp1.QuadPart * result.QuadPart;
                temp3.LowPart = arg1;
                temp3.HighPart = 0;
                temp4.QuadPart = temp2.QuadPart % temp3.QuadPart;
                result.QuadPart = temp4.QuadPart;
            }
            arg2 >>= 1;
            temp1.LowPart = arg3;
            temp1.HighPart = 0;
            temp1.QuadPart *= temp1.QuadPart;
            temp2.LowPart = arg1;
            temp2.HighPart = 0;
            temp3.QuadPart = temp1.QuadPart % temp2.QuadPart;
            arg3 = temp3.LowPart;
            if (arg2==0)
                break;
        }
        return result.LowPart;
    }

Это то, в чем я пока не уверен:

  1. Является ли DWORD в C ++ UInt32 или Int32 в C #?
  2. if(целое число и integer) означает, что if(целое число и integer ==0)?//именно здесь находится ошибка, которую я описал выше.
  3. if(!целое число) означает if(целое число != 0)?
  4. Почему operator & не может использоваться логически в C # , что означает, что для него требуется логическое значение?
  5. "LARGE_INTEGER result = {1, 0}" означает результат.нижняя часть равна 1, а result.highpart равна 0 или result.Quadpart = 1?

Заранее спасибо!

Это было полезно?

Решение

Где ты пишешь :

если (arg1 и arg2==0)

Компилятор понимает :

if (arg1 & (arg2==0))

Вы должны написать :

if ((arg1 & arg2) == 0)

Именно таким образом оператор C ++ должен быть переведен на C# :

if (arg2 & 1) // C++ (arg2 is DWORD)
if ((arg2 & 1) != 0) // C# (arg2 is Uint32)

Или, в более общем смысле:

if (Flags & FlagToCheck) // C++
if ((Flags & FlagToCheck) != 0) // C#

В C / C ++ 0 равно false, все остальное равно true.

  1. Вы должны проверить определение DWORD, оно должно быть (unsigned int), которое является UInt32 в C#
  2. if (integer & целое число) в C / C ++ означает "если результат побитового вычисления между двумя целыми числами не равен 0" (0 равно false, все остальное равно true).
  3. if (!целое число) означает if (целое число == 0) (опять же, 0 равно false, все остальное равно true)
  4. в C #, как и в Java, я думаю, логические значения и числа - это две разные вещи, вы можете использовать логические значения только в операторах "if", неявное преобразование не выполняется, если вы используете int :он не будет компилироваться.
  5. Я оставлю это кому-нибудь другому, мне нужно было бы протестировать, чтобы быть уверенным...

Другие советы

  1. DWORD является uint32_t в C ++, таким образом UInt32 в C#.
  2. if(a & b) преобразует в if((a & b) != 0). != оценивается перед & таким образом, & выражение нуждается в круглых скобках вокруг него.
  3. if(x) преобразует в if(x != 0)
  4. & является 'побитовым и' в C #, как и в C ++.
  5. Зависит от вашей структуры C ++.

5 - Это означает и то, и другое.Потому что LowPart и HighPart - это просто "окна" в память QuadPart, когда result.LowPart == 1 и Result.HighPart == 0, тогда result.QuadPart будет равен 1.

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