Comment utiliser le & opérateur en C#? Est la traduction du code correct?
la ligne "if(arg2 & 1)" en C++(arg2 est DWORD) est égal à "si(arg2 & 1==0)" en C#(arg2 est Uint32),droit?
Je suis en train de traduire une fonction de C++ pour le C#,mais j'obtiens une erreur:
Operator '&' cannot be applied to operands of type 'uint' and 'bool'
Je serais également reconnaissante si vous pouviez voir dans l'ensemble de la fonction pour toutes les autres erreurs.
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;
}
Converti en C#
LARGE_INTEGER structure:
[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct LARGE_INTEGER
{
[FieldOffset(0)]
public Int64 QuadPart;
[FieldOffset(0)]
public UInt32 LowPart;
[FieldOffset(4)]
public Int32 HighPart;
}
Fonction:
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;
}
C'est ce que je ne suis pas encore sûr:
- Si une valeur DWORD en C++ est UInt32 Int32 ou en C#?
- if(integer & integer) signifie que si(entier et entier ==0)? //c'est là l'erreur que j'ai décrit ci-dessus est placé.
- if(!entier) signifie que si(entier != 0)?
- Pourquoi l'opérateur & ne peut pas être utilisé logiquement en C# ,le sens qu'il nécessite un booléen?
- "LARGE_INTEGER résultat = {1, 0}" signifie résultat.lowpart est de 1 et le résultat.highpart est de 0 ou de résultat.Quadpart = 1?
Merci d'avance!
OriginalL'auteur Ivan Prodanov | 2009-03-26
Vous devez vous connecter pour publier un commentaire.
Où vous écrivez :
si (arg1 & arg2==0)
Le compilateur comprend :
Vous devriez écrire :
C'est la façon dont le C++ déclaration doit être traduite en C# :
Ou, de façon plus générique moyen:
En C/C++, 0 est faux, tout le reste est vrai.
re "arg2 & 1" => "(arg2 & 1) == 1"; Est-ce exact? Je pensais que C/C++ "vrai" était "non nulle"; il doit donc être "(arg2 & 1) != 0" - sinon, vous êtes de commutation "tout" à "tous" ; Idem: (Drapeaux & FlagToCheck) != 0
Mais (arg2 & 1) ne peut être que 1 ou 0. Alors qu'il travaille à la même chose.
ah, à droite. Vrai, mais juste demander pour quelqu'un de tomber dans un copier/coller piège...
Merci pour votre remarque, je vais modifier.
OriginalL'auteur ybo
DWORD
estuint32_t
en C++, doncUInt32
en C#.if(a & b)
convertit àif((a & b) != 0)
.!=
est évalué avant&
ainsi, le&
l'expression des besoins des parenthèses autour d'elle.if(x)
convertit àif(x != 0)
&
est un "bit à bit et' en C#, comme en C++.Alors je n'ai aucune idée. Regardez dans vos fichiers d'en-tête pour LARGE_INTEGER; je doute qu'elle est intégrée dans le compilateur.
J'ai pensé à elle,la partie Basse est d'abord et la partie Haute est deuxième,signification lowpart=1 et highpart=0. Merci,j'ai accepté ta réponse!
Vous trouverez des informations sur les LARGE_INTEGER ici: msdn.microsoft.com/en-us/library/aa383713(SV.85).aspx
OriginalL'auteur strager
5 - Cela signifie à la fois. Parce que LowPart et HighPart sont juste des "fenêtres" dans QuadPart de la mémoire, lorsque le résultat.LowPart == 1 et de Raison.HighPart == 0, alors le résultat.QuadPart sera égal à 1.
OriginalL'auteur Jim Mischel