En R, si hago bitXor(2496638211, -1798328965) , obtengo 120 devueltos.
En nodeJS 2496638211 ^ -1798328965; devuelve 120.
¿Cómo hago esto en C#? (Creo que estoy luchando por entender la declaración de tipo c# y la forma en que R & nodeJS presumiblemente se convierten a 32 bits)
En C# tendrías que usar unchecked y convertir a int:
unchecked { int result = (int)2496638211 ^ -1798328965; Console.WriteLine(result); // Prints 120 }Podrías escribir un método para hacer esto:
public static int XorAsInts(long a, long b) { unchecked { return (int)a ^ (int)b; } }Entonces llámalo:
Console.WriteLine(XorAsInts(2496638211, -1798328965)); // Prints 120 Tenga en cuenta que al convertir a int , está desechando los primeros 32 bits del long . Esto es lo que está haciendo bitXor() , pero ¿está realmente seguro de que este es el comportamiento que desea?
2496638211 es mayor que un entero de 32 bits y en sistemas de 64 bits con enteros de C# los valores predeterminados son largos, por lo que la representación del valor hexadecimal es 0x94CFAD03 . Ese 9 se superpone con los bits de signo. Esto también significa que -1798328965 da como resultado 0xFFFFFFFF94CFAD7B debido a la representación de números negativos. Entonces C# obtiene 0xFFFFFFFF00000078 que es la respuesta correcta.
JS XOR usa operandos de 32 bits, por lo que trunca 2496638211 . Por lo tanto, JS obtiene 0x00000078 que técnicamente no es la respuesta correcta. Mi suposición es que R hace lo mismo o similar.
En JS use Number.isSafeInteger() así como Number.MAX_SAFE_INTEGER . En C# verifique int.MaxValue vs long.MaxValue para ver la diferencia vs JS.
Para recrear el comportamiento de JS en C#, envuélvalo en un bloque unchecked marcar según la publicación de Matthew Watson. La palabra clave unchecked se usa para suprimir la verificación de desbordamiento para conversiones y operaciones aritméticas de tipo integral.