]> mj.ucw.cz Git - libucw.git/commitdiff
ffs _cannot_ be used as a substitute for log2, because it scans in the
authorMartin Mares <mj@ucw.cz>
Wed, 3 Dec 1997 08:11:25 +0000 (08:11 +0000)
committerMartin Mares <mj@ucw.cz>
Wed, 3 Dec 1997 08:11:25 +0000 (08:11 +0000)
opposite direction :-(

Fixed our own log2 (it hadn't any chance to work before).

lib/config.h
lib/lib.h
lib/log2.c

index 62ef1af356452fe52374ae3e6a47bc91f3feab24..e9b84fc38ba20a1b141528e02f490a712ddd2dfa 100644 (file)
@@ -39,7 +39,3 @@ typedef unsigned int uns;             /* at least 32 bits */
 #define NONRET
 
 #endif
-
-#ifdef linux
-#define HAVE_FFS
-#endif
index 24d7e352cf233b72197c84b83689c2d72cb53fdd..59cb662143e95434a62e1e04049fc5e6716578db 100644 (file)
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -74,11 +74,7 @@ int match_ct_filter(struct ct_filter *, byte *);
 
 /* Binary log */
 
-#ifdef HAVE_FFS
-#define log2(x) (ffs(x) - 1)
-#else
 int log2(ulg);
-#endif
 
 /* obj.c */
 
index dc0a92975fa750f4edad78ae08db5d5403b4f137..3cd983357d573dd658c58dd99786c1c6099a9812 100644 (file)
@@ -8,8 +8,10 @@
 
 #include "lib.h"
 
+#undef log2
+
 int
-ffs(ulg x)
+log2(ulg x)
 {
   ulg l;
 
@@ -17,10 +19,10 @@ ffs(ulg x)
        return 0;
 
   l = 0;
-  if (x & 0xffff0000) l += 16;
-  if (x & 0xff00ff00) l += 8;
-  if (x & 0xf0f0f0f0) l += 4;
-  if (x & 0xcccccccc) l += 2;
+  if (x & 0xffff0000) { l += 16; x &= 0xffff0000; }
+  if (x & 0xff00ff00) { l += 8;  x &= 0xff00ff00; }
+  if (x & 0xf0f0f0f0) { l += 4;  x &= 0xf0f0f0f0; }
+  if (x & 0xcccccccc) { l += 2;  x &= 0xcccccccc; }
   if (x & 0xaaaaaaaa) l++;
   return l;
 }