3

C++ の "if(arg2 & 1)" (arg2 は DWORD) という行は、C# の "if(arg2 & 1==0)" (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. C++ の DWORD は C# の UInt32 か Int32 か?
  2. if(integer & integer) は if(integer and integer ==0) を意味しますか? //これは、上記で説明したエラーが配置される場所です。
  3. if(!integer) は if(integer != 0)? を意味します。
  4. 演算子 & を C# で論理的に使用できないのはなぜですか?つまり、ブール値が必要なのですか?
  5. "LARGE_INTEGER result = {1, 0}" は、result.lowpart が 1 で、result.highpart が 0 または result.Quadpart = 1 であることを意味します。

前もって感謝します!

4

3 に答える 3

11

あなたが書く場所:

もし (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 の定義を確認する必要があります。C# では UInt32 である (unsigned int) である必要があります。
  2. if (integer & integer), C/C++ では、「ビットごとの結果と 2 つの整数の間の結果が 0 でない場合」を意味します (0 は false、それ以外はすべて true)。
  3. if (!integer) は if (integer == 0) を意味します (繰り返しますが、0 は偽で、それ以外はすべて真です)
  4. C# では、Java のように、ブール値と数値は 2 つの異なるものだと思います。「if」ステートメントでのみブール値を使用できます。int を使用する場合、暗黙的な変換はありません。コンパイルされません。
  5. これは他の人に任せます。確認するためにテストする必要があります...
于 2009-03-26T11:54:27.963 に答える
4
  1. DWORDuint32_tC++、つまりC UInt32# です。
  2. if(a & b)に変換しif((a & b) != 0)ます。 !=は前に評価される&ため、&式には括弧が必要です。
  3. if(x)に変換しますif(x != 0)
  4. &C++ のように、C# では「ビット単位の AND」です。
  5. C++ 構造に依存します。
于 2009-03-26T11:57:44.773 に答える
1

5-それは両方を意味します。LowPartとHighPartはQuadPartのメモリへの単なる「ウィンドウ」であるため、result.LowPart==1およびResult.HighPart==0の場合、result.QuadPartは1に等しくなります。

于 2009-03-26T12:12:23.037 に答える