Как использовать оператор & в C #?Правильный ли перевод кода?
-
22-08-2019 - |
Вопрос
строка "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;
}
Это то, в чем я пока не уверен:
- Является ли DWORD в C ++ UInt32 или Int32 в C #?
- if(целое число и integer) означает, что if(целое число и integer ==0)?//именно здесь находится ошибка, которую я описал выше.
- if(!целое число) означает if(целое число != 0)?
- Почему operator & не может использоваться логически в C # , что означает, что для него требуется логическое значение?
- "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.
- Вы должны проверить определение DWORD, оно должно быть (unsigned int), которое является UInt32 в C#
- if (integer & целое число) в C / C ++ означает "если результат побитового вычисления между двумя целыми числами не равен 0" (0 равно false, все остальное равно true).
- if (!целое число) означает if (целое число == 0) (опять же, 0 равно false, все остальное равно true)
- в C #, как и в Java, я думаю, логические значения и числа - это две разные вещи, вы можете использовать логические значения только в операторах "if", неявное преобразование не выполняется, если вы используете int :он не будет компилироваться.
- Я оставлю это кому-нибудь другому, мне нужно было бы протестировать, чтобы быть уверенным...
Другие советы
DWORD
являетсяuint32_t
в C ++, таким образомUInt32
в C#.if(a & b)
преобразует вif((a & b) != 0)
.!=
оценивается перед&
таким образом,&
выражение нуждается в круглых скобках вокруг него.if(x)
преобразует вif(x != 0)
&
является 'побитовым и' в C #, как и в C ++.- Зависит от вашей структуры C ++.
5 - Это означает и то, и другое.Потому что LowPart и HighPart - это просто "окна" в память QuadPart, когда result.LowPart == 1 и Result.HighPart == 0, тогда result.QuadPart будет равен 1.