如何使用&;C#中的运算符?代码的翻译正确吗?

如何使用&;C#中的运算符?代码的翻译正确吗?,c#,operators,bitwise-operators,conditional-statements,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++ 功能: public static UInt32 X4(UInt32 arg1, UInt32

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++

功能:

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;
    }
公共静态UInt32 X4(UInt32 arg1、UInt32 arg2、UInt32 arg3)
{
大整数结果=新的大整数();
结果:LowPart=1;
result.HighPart=0;
大整数temp1=新的大整数();
大整数temp2=新的大整数();
大整数temp3=新的大整数();
大整数temp4=新的大整数();
对于(int x=0;x<32;++x)
{
如果(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;
如果(arg2==0)
打破
}
返回result.LowPart;
}
这是我还不确定的:

<> C++中的dWord是否为uTI32或It32?
  • if(integer&integer)表示if(integer和integer==0)//这就是我上面描述的错误所在
  • if(!integer)表示if(integer!=0)
  • 为什么运算符&不能在C#中逻辑使用,这意味着它需要布尔值
  • “大整数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 (Flags & FlagToCheck) // C++
    if ((Flags & FlagToCheck) != 0) // C#
    

    在C/C++中,0是假的,其他的都是真的

  • 您应该检查DWORD的定义,它应该是(unsigned int),在C中是UInt32#
  • if(integer&integer),在C/C++中的意思是“如果两个整数之间的按位and的结果不是0”(0为false,其他所有内容都为true)
  • if(!integer)表示if(integer==0)(同样,0为false,其他所有内容均为true)
  • 在C#中,就像在Java中一样,我认为布尔和数字是两个不同的东西,只能在“if”语句中使用布尔,如果使用int,则不会进行隐式转换:它不会编译
  • 我会把这个留给其他人,我需要测试以确定
  • <>代码> dWord <代码>是C++中的代码> uTIN 32×T/<代码>,因此<代码> UTIN 32 < /C> > C</LI>
  • 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。

    您确定它的if((arg2&1)==1)不应该是if((arg2&1)==0)?你能检查一下我说的五件我想知道的事情吗(它们在两个函数下面)。谢谢,我查到了你的答案,如果你确认这五件事,我会接受的。:)关于“arg2&1=>”(arg2&1==1);是这样吗?我认为C/C++“真”是“非零”;所以应该是“(arg2&1)!=0”-否则您将“任意”切换为“全部”;同上:(Flags&FlagToCheck)!=0但(arg2和arg1)只能是1或0。所以结果是一样的。@Jim-啊,对了。没错,但只是要求某人落入复制/粘贴陷阱…@Marc:是的。“= 0”是绝对可行的。C++中没有结构,大整数是一个构建的IT结构。我找不到它。“约翰,我不知道。在头文件中查找大整数;我怀疑它是否内置在编译器中。我发现,低部分是第一位的,高部分是第二位的,这意味着低部分=1,高部分=0。谢谢,我接受了你的回答!你可以在这里找到关于大整数的信息:我也找到了你的答案,我已经知道了大整数是如何工作的,但是我感谢你的帮助,所以+1:)
    if ((arg1 & arg2) == 0)
    
    if (arg2 & 1) // C++ (arg2 is DWORD)
    if ((arg2 & 1) != 0) // C# (arg2 is Uint32)
    
    if (Flags & FlagToCheck) // C++
    if ((Flags & FlagToCheck) != 0) // C#