]> www.ginac.de Git - cln.git/blob - src/base/digit/cl_2D_div.cc
Finalize CLN 1.3.7 release.
[cln.git] / src / base / digit / cl_2D_div.cc
1 // div2adic().
2
3 // General includes.
4 #include "base/cl_sysdep.h"
5
6 // Specification.
7 #include "base/digit/cl_2D.h"
8
9
10 // Implementation.
11
12 namespace cln {
13
14 uintD div2adic (uintD a, uintD b)
15 {
16 // Methode:
17 // Konstruiere c Bit für Bit.
18 // c := 0, d := a.
19 // Für j=0,...,intDsize:
20 //   [Hier b*c == a mod 2^j und d = (a-b*c)/2^j.] j=intDsize -> fertig.
21 //   Falls d ungerade, setze c:=c+2^j und d:=(d-b)/2, sonst d:=d/2.
22 // Ergebnis c.
23       ASSERT(!((b % 2) ==0))
24 #if 1
25      {var uintD c = 0;
26       var uintD bit_j = 1; // 2^j
27       loop // Verwende a als Variable d
28         { if (a & bit(0)) { c = c+bit_j; a = a-b; }
29           a = a>>1;
30           bit_j = bit_j << 1;
31           if (bit_j == 0) break; // j=intDsize -> fertig
32         }
33       return c;
34      }
35 #else
36      {var uintD bit_j = 1; // 2^j
37       var uintD b_j = b-1; // (b-1)*2^j
38       loop // Verwende a als Variable d*2^j+c
39         { if (a & bit_j) { a = a - b_j; }
40           b_j = b_j << 1; bit_j = bit_j << 1;
41           if (bit_j == 0) break; // j=intDsize -> fertig
42         }
43       return a;
44      }
45 #endif
46 }
47
48 }  // namespace cln