]> www.ginac.de Git - cln.git/blobdiff - src/integer/misc/cl_I_power2p.cc
2006-04-25 Bruno Haible <bruno@clisp.org>
[cln.git] / src / integer / misc / cl_I_power2p.cc
index 07790ca2e8a0047707ff8b4caad47a3f2d608d0e..dc29c24d8eda6ec66f7f4d0ba3bdb2dccbb93698 100644 (file)
@@ -4,7 +4,7 @@
 #include "cl_sysdep.h"
 
 // Specification.
-#include "cl_integer.h"
+#include "cln/integer.h"
 
 
 // Implementation.
 #include "cl_I.h"
 #include "cl_DS.h"
 
-uintL power2p (const cl_I& x) // x > 0
+namespace cln {
+
+uintC power2p (const cl_I& x) // x > 0
 {
 // Methode 1: Wenn ord2(x) = integer_length(x)-1.
 // Methode 2: Wenn logand(x,x-1) = 0.
 // Methode 3: Wenn das erste Digit /=0 eine Zweierpotenz ist und alle weiteren
 //            Digits Null sind.
        if (fixnump(x))
-         { var uintL x_ = FN_to_UL(x);
+         { var uintV x_ = FN_to_UV(x);
            if (!((x_ & (x_-1)) == 0)) return 0; // keine Zweierpotenz
+            #if (intVsize>32)
+            integerlength64(x_,return); // Zweierpotenz: n = integer_length(x)
+            #else
            integerlength32(x_,return); // Zweierpotenz: n = integer_length(x)
+            #endif
          }
          else
          { var const uintD* MSDptr;
@@ -35,6 +41,8 @@ uintL power2p (const cl_I& x) // x > 0
            if (DS_test_loop(MSDptr mspop 1,len-1,LSDptr)) return 0; // danach alles Nullen
           {var uintL msdlen;
            integerlengthD(msd, msdlen=);
-           return intDsize*(uintL)(len-1) + msdlen; // integer_length(x) als Ergebnis
+           return intDsize*(len-1) + msdlen; // integer_length(x) als Ergebnis
          }}
 }
+
+}  // namespace cln