X-Git-Url: https://ginac.de/CLN/cln.git//cln.git?a=blobdiff_plain;f=src%2Finteger%2Fbitwise%2Fcl_I_logeqv.cc;fp=src%2Finteger%2Fbitwise%2Fcl_I_logeqv.cc;h=904231ae5b1ad4fcfab44933d81a726012eacaa5;hb=dd9e0f894eec7e2a8cf85078330ddc0a6639090b;hp=0000000000000000000000000000000000000000;hpb=d57000b193438122b366aa0d450674be9402d06c;p=cln.git diff --git a/src/integer/bitwise/cl_I_logeqv.cc b/src/integer/bitwise/cl_I_logeqv.cc new file mode 100644 index 0000000..904231a --- /dev/null +++ b/src/integer/bitwise/cl_I_logeqv.cc @@ -0,0 +1,40 @@ +// logeqv(). + +// General includes. +#include "cl_sysdep.h" + +// Specification. +#include "cl_integer.h" + + +// Implementation. + +#include "cl_I.h" +#include "cl_DS.h" +#include "cl_I_log.h" + +// Logische Operationen auf Integers: +// Methode: aus den Längen der beiden Argumente eine obere Schranke für +// die Länge des Ergebnisses berechnen (das Maximum der beiden Längen und +// FN_maxlength), so daß das MSD für unendlich viele Bits steht. +// Dann beide Argumente in gleichgroße Digit sequences umwandeln, Operation +// mit einer einfachen Schleife durchführen. + +const cl_I logeqv (const cl_I& x, const cl_I& y) + { if (fixnump(x) && fixnump(y)) // Beides Fixnums -> ganz einfach: + { // bitweise als Fixnum zurück + return cl_I_from_word(~(x.word ^ y.word) & cl_combine(cl_FN_tag,~(cl_uint)0)); + } + else + { CL_ALLOCA_STACK; + var uintC n; // Anzahl der Digits + {var uintC nx = I_to_DS_need(x); + var uintC ny = I_to_DS_need(y); + n = (nx>=ny ? nx : ny); + } + {var uintD* xptr; I_to_DS_n(x,n,xptr=); // Pointer in DS zu x + var uintD* yptr; I_to_DS_n(y,n,yptr=); // Pointer in DS zu y + var uintD* zptr = xptr; // Pointer aufs Ergebnis + eqv_loop_msp(xptr,yptr,n); // mit NOT XOR verknüpfen + return DS_to_I(zptr,n); // Ergebnis als Integer + } }}