You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.3 KiB
40 lines
1.3 KiB
// logorc2().
|
|
|
|
// 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 logorc2 (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
|
|
orc2_loop_msp(xptr,yptr,n); // mit OR NOT verknüpfen
|
|
return DS_to_I(zptr,n); // Ergebnis als Integer
|
|
} }}
|