7 #include "cln/integer.h"
17 uintC power2p (const cl_I& x) // x > 0
19 // Methode 1: Wenn ord2(x) = integer_length(x)-1.
20 // Methode 2: Wenn logand(x,x-1) = 0.
21 // Methode 3: Wenn das erste Digit /=0 eine Zweierpotenz ist und alle weiteren
24 { var uintV x_ = FN_to_UV(x);
25 if (!((x_ & (x_-1)) == 0)) return 0; // keine Zweierpotenz
27 integerlength64(x_,return); // Zweierpotenz: n = integer_length(x)
29 integerlength32(x_,return); // Zweierpotenz: n = integer_length(x)
33 { var const uintD* MSDptr;
35 var const uintD* LSDptr;
36 BN_to_NDS_nocopy(x, MSDptr=,len=,LSDptr=); // normalisierte DS zu x bilden.
37 var uintD msd = mspref(MSDptr,0);
38 if (msd==0) { msshrink(MSDptr); msd = mspref(MSDptr,0); len--; }
39 // len = Anzahl der Digits ab MSDptr, len>0, msd = erstes Digit (/=0)
40 if (!((msd & (msd-1)) == 0)) return 0; // erstes Digit muß Zweierpotenz sein
41 if (DS_test_loop(MSDptr mspop 1,len-1,LSDptr)) return 0; // danach alles Nullen
43 integerlengthD(msd, msdlen=);
44 return intDsize*(len-1) + msdlen; // integer_length(x) als Ergebnis