]> www.ginac.de Git - cln.git/blob - src/integer/bitwise/cl_I_ilength.cc
Janitorial clean-up.
[cln.git] / src / integer / bitwise / cl_I_ilength.cc
1 // integer_length().
2
3 // General includes.
4 #include "base/cl_sysdep.h"
5
6 // Specification.
7 #include "cln/integer.h"
8
9
10 // Implementation.
11
12 #include "integer/cl_I.h"
13 #include "base/digitseq/cl_DS.h"
14
15 namespace cln {
16
17 uintC integer_length (const cl_I& x)
18 {
19         if (fixnump(x))
20           { var uintL bitcount = 0;
21             var uintV x_ = FN_to_V(x); // x als intVsize-Bit-Zahl
22             if (FN_V_minusp(x,(sintV)x_)) { x_ = ~ x_; } // falls <0, komplementieren
23             if (!(x_==0)) {
24               #if (intVsize>32)
25               integerlength64(x_,bitcount=);
26               #else
27               integerlength32(x_,bitcount=);
28               #endif
29             }
30             return bitcount; // 0 <= bitcount < intVsize.
31           }
32           else
33           { var const uintD* MSDptr;
34             var uintC len;
35             BN_to_NDS_nocopy(x, MSDptr=,len=,); // normalisierte DS zu x bilden.
36             var uintC bitcount = intDsize*(len-1); // Anzahl Digits mal intDsize
37             // MSDigit nehmen, testen, welches das höchste Bit ist, das vom
38             // Vorzeichenbit abweicht:
39             var uintD msd = mspref(MSDptr,0); // MSDigit
40             if ((sintD)msd < 0) { msd = ~msd; } // falls negativ, invertieren
41             // Position des höchsten Bits in msd suchen und entsprechend bit_count
42             // erhöhen (um höchstens intDsize-1):
43             if (!(msd == 0)) { integerlengthD(msd, bitcount += ); }
44             return bitcount; // 0 <= bitcount < intDsize*2^intCsize.
45           }
46 }
47
48 }  // namespace cln