c# - 如何在 C# 中使用 & 运算符?代码的翻译是否正确?

标签 c# operators bitwise-operators conditional-statements

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 是 UInt32 还是 C# 中的 Int32?
  2. if(integer & integer) 是指 if(integer and integer ==0)?//这是我上面描述的错误所在。
  3. if(!integer) 表示 if(integer != 0)?
  4. 为什么运算符 & 不能在 C# 中逻辑使用,这意味着它需要一个 bool 值?
  5. “LARGE_INTEGER result = {1, 0}”表示 result.lowpart 为 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 为假,其他均为真。

  1. 你应该检查一下DWORD的定义,应该是(unsigned int),在C#中是UInt32
  2. if (integer & integer),在C/C++中的意思是“如果两个整数之间按位运算的结果不为0”(0为假,其他均为真)。
  3. if (!integer) 表示 if (integer == 0)(同样,0 为假,其他均为真)
  4. 在 C# 中,就像在 Java 中一样,我认为, bool 值和数字是两种不同的东西,您只能在“if”语句中使用 bool 值,如果您使用 int,则没有隐式转换:它不会编译。<
  5. 我会把这个留给其他人,我需要进行测试以确保...

关于c# - 如何在 C# 中使用 & 运算符?代码的翻译是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685436/

相关文章:

c# - 反转位移运算符/2 的幂

c# - 为什么 Application.Restart() 不可靠?

c - sizeof是函数还是运算符?

PHP 运算符 <>

Python a &= b 是什么意思?

c - 如何对变量进行位移并形成整个值

Java: a|=b 等于 a = a || b 代表 boolean 值?

c# - 回发 ASP NET 上未选中复选框

c# - 确定代码是否作为单元测试的一部分运行

c# - 将属性附加到对象