4 #include "base/cl_sysdep.h"
7 #include "cln/integer.h"
12 #include "integer/cl_I.h"
13 #include "base/digitseq/cl_DS.h"
17 bool logtest (const cl_I& x, const cl_I& y)
20 // Fixnums separat behandeln.
21 // Sei oBdA x die kürzere der beiden Zahlen (in Digits).
22 // x echt kürzer und x<0 -> [eines der most signif. intDsize+1 Bits von y ist 1] Ja.
23 // Beide gleich lang oder x>=0 ->
24 // Kann mich auf die untersten length(x) Digits beschraenken.
25 // Mit AND durchlaufen, abbrechen (mit "Ja") falls /=0. Am Ende: Nein.
29 { if ((x.word & y.word & cl_combine(0,~(cl_uint)0))==0)
35 // x Fixnum, y Bignum, also ist x echt kürzer
36 { if (FN_V_minusp(x,FN_to_V(x))) return true; // x<0 -> ja.
37 // x>=0. Kombiniere x mit den pFN_maxlength letzten Digits von y.
38 {var const uintD* yLSDptr;
39 var uintV x_ = FN_to_V(x);
40 BN_to_NDS_nocopy(y, ,,yLSDptr=);
41 #if (pFN_maxlength > 1)
42 doconsttimes(pFN_maxlength-1,
43 if (lsprefnext(yLSDptr) & (uintD)x_) return true;
47 if (lsprefnext(yLSDptr) & (uintD)x_) return true;
52 // x Bignum, y Fixnum, analog wie oben, nur x und y vertauscht
53 { if (FN_V_minusp(y,FN_to_V(y))) return true; // y<0 -> ja.
54 // y>=0. Kombiniere y mit den pFN_maxlength letzten Digits von x.
55 {var const uintD* xLSDptr;
56 var uintV y_ = FN_to_V(y);
57 BN_to_NDS_nocopy(x, ,,xLSDptr=);
58 #if (pFN_maxlength > 1)
59 doconsttimes(pFN_maxlength-1,
60 if (lsprefnext(xLSDptr) & (uintD)y_) return true;
64 if (lsprefnext(xLSDptr) & (uintD)y_) return true;
69 { var const uintD* xMSDptr;
71 var const uintD* yMSDptr;
73 BN_to_NDS_nocopy(x, xMSDptr=,xlen=,);
74 BN_to_NDS_nocopy(y, yMSDptr=,ylen=,);
75 // Beachte: xlen>0, ylen>0.
77 // beide verschieden lang
79 { // x ist die echt kürzere DS.
80 if ((sintD)mspref(xMSDptr,0)<0) // der echt kürzere ist negativ?
82 // Der echt kürzere ist positiv.
83 yMSDptr = yMSDptr mspop (ylen-xlen);
86 { // y ist die echt kürzere DS.
87 if ((sintD)mspref(yMSDptr,0)<0) // der echt kürzere ist negativ?
89 // Der echt kürzere ist positiv.
90 xMSDptr = xMSDptr mspop (xlen-ylen);
93 // Nach gemeinsamen Bits in xMSDptr/xlen/.. und yMSDptr/xlen/..
95 return and_test_loop_msp(xMSDptr,yMSDptr,xlen);