Browse Source

simpler log2 implementation

Roberto Ierusalimschy 22 years ago
parent
commit
01b303c87e
1 changed files with 11 additions and 20 deletions
  1. 11 20
      lobject.c

+ 11 - 20
lobject.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lobject.c,v 1.96 2003/02/18 16:02:56 roberto Exp roberto $
+** $Id: lobject.c,v 1.97 2003/04/03 13:35:34 roberto Exp roberto $
 ** Some generic functions over Lua objects
 ** See Copyright Notice in lua.h
 */
@@ -45,29 +45,20 @@ int luaO_int2fb (unsigned int x) {
 
 
 int luaO_log2 (unsigned int x) {
-  static const lu_byte log_8[255] = {
-    0,
-    1,1,
-    2,2,2,2,
-    3,3,3,3,3,3,3,3,
-    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-    5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+  static const lu_byte log_2[256] = {
+    0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
     6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
     7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
     7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
   };
-  if (x >= 0x00010000) {
-    if (x >= 0x01000000) return log_8[((x>>24) & 0xff) - 1]+24;
-    else return log_8[((x>>16) & 0xff) - 1]+16;
-  }
-  else {
-    if (x >= 0x00000100) return log_8[((x>>8) & 0xff) - 1]+8;
-    else if (x) return log_8[(x & 0xff) - 1];
-    return -1;  /* special `log' for 0 */
-  }
+  int l = -1;
+  while (x >= 256) { l += 8; x >>= 8; }
+  return l + log_2[x];
+
 }