]> www.ginac.de Git - cln.git/blob - src/integer/bitwise/cl_I_mkf.cc
Use paths relative the `src' directory in the #include directives.
[cln.git] / src / integer / bitwise / cl_I_mkf.cc
1 // mask_field().
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 "cln/integer.h"
13 #include "integer/cl_I.h"
14 #include "integer/bitwise/cl_I_byte.h"
15
16 namespace cln {
17
18 const cl_I mask_field (const cl_I& n, const cl_byte& b)
19 {
20       // Methode:
21       // (mask-field (byte s p) n) extrahiere die Bits p,...,p+s-1 von n.
22       // l:=(integer-length n)
23       // Falls l <= p :
24       //   Falls n>=0: 0, falls n<0: 2^(p+s) - 2^p (s Einsenbits).
25       // Falls p <= l :
26       //   q:=min(p+s,l).
27       //   Extrahiere die Bits p,...,q-1 von n.
28       //   Falls p+s>l und n<0, füge p+s-l Einsenbits an (addiere 2^(p+s)-2^l).
29       var uintC s = b.size;
30       var uintC p = b.position;
31      {var uintC ps = p+s;
32       var uintC l = integer_length(n); // l = (integer-length n)
33       if (l<=p)
34         // l<=p
35         if (!minusp(n))
36           // n>=0
37           return 0; // 0 als Ergebnis
38           else
39           // n<0
40           return cl_fullbyte(p,ps); // 2^(p+s)-2^p als Ergebnis
41         else
42         // l>p
43         { // Bits p,...,q-1 mit q = min(p+s,l) extrahieren:
44           var cl_I erg = mkf_extract(n,p,(ps<l ? ps : l));
45           if ((ps>l) && minusp(n)) // p+s>l und n<0 ?
46             { return logior(erg,cl_fullbyte(l,ps)); } // setze Bits l,...,p+s-1
47             // (logisches Exklusiv-Oder oder Addition ginge auch)
48             else
49             return erg;
50      }  }
51 }
52
53 }  // namespace cln