]> www.ginac.de Git - cln.git/blob - src/integer/bitwise/cl_I_ldb.cc
Initial revision
[cln.git] / src / integer / bitwise / cl_I_ldb.cc
1 // ldb().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_integer.h"
8
9
10 // Implementation.
11
12 #include "cl_integer.h"
13 #include "cl_I.h"
14 #include "cl_I_byte.h"
15
16 const cl_I ldb (const cl_I& n, const cl_byte& b)
17 {
18       // Methode:
19       // (ldb (byte s p) n) extrahiere die Bits p,...,p+s-1 von n.
20       // l:=(integer-length n)
21       // Falls l <= p :
22       //   Falls n>=0: 0, falls n<0: 2^s - 1 (s Einsenbits).
23       // Falls p <= l :
24       //   q:=min(p+s,l).
25       //   Extrahiere die Bits p,...,q-1 von n.
26       //   Falls p+s>l und n<0, füge p+s-l Einsenbits an (addiere 2^s-2^(l-p)).
27       var uintL s = b.size;
28       var uintL p = b.position;
29       var uintL l = integer_length(n); // l = (integer-length n)
30       if (l<=p)
31         // l<=p
32         if (!minusp(n))
33           // n>=0
34           return 0; // 0 als Ergebnis
35           else
36           // n<0
37           return cl_fullbyte(0,s); // 2^s-2^0 als Ergebnis
38         else
39         // l>p
40         { var cl_I erg = ldb_extract(n,p,(p+s<l ? p+s : l));
41           var uintL lp = l-p;
42           if ((s>lp) && minusp(n)) // s>l-p und n<0 ?
43             { return logior(erg,cl_fullbyte(lp,s)); } // setze Bits l-p,...,s-1
44             // (logisches Exklusiv-Oder oder Addition ginge auch)
45             else
46             return erg;
47         }
48 }