diff --git a/examples/eratosthenes.c b/examples/eratosthenes.c
index fd38ca7de56bdd79bb747d2574eb3d256c515a75..97abe191e973dc903825849b2718935cc58d2282 100644
--- a/examples/eratosthenes.c
+++ b/examples/eratosthenes.c
@@ -112,13 +112,26 @@ vector_clear_bits (unsigned long *vector, unsigned long step,
 
 static unsigned
 find_first_one (unsigned long x)
-{
-  unsigned table[0x10] =
+{  
+  unsigned table[0x101] =
     {
-      /* 0, 1,  2,  3,  4,  5,  6,  7 */
-	-1, 0,  1,  0,  2,  0,  1 , 0,
-      /* 8, 9, 10, 11, 12, 13, 14, 15 */
-	 3, 0,  1,  0,  2,  0,  1,  0
+     15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     12, 0, 0, 0, 0, 0, 0, 0,11, 0, 0, 0,10, 0, 9, 8,
+      0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+      4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      7,
     };
 
   /* Isolate least significant bit */
@@ -127,7 +140,7 @@ find_first_one (unsigned long x)
   unsigned i = 0;
 #if NEED_HANDLE_LARGE_LONG
 #ifndef SIZEOF_LONG
-  /* Can't not be tested by the preprocessor. May generate warnings
+  /* Can not be tested by the preprocessor. May generate warnings
      when long is 32 bits. */
   if (BITS_PER_LONG > 32)
 #endif
@@ -143,17 +156,7 @@ find_first_one (unsigned long x)
       x >>= 16;
       i += 16;
     }
-  if (x >= 0x100)
-    {
-      x >>= 8;
-      i += 8;
-    }
-  if (x >= 0x10)
-    {
-      x >>= 4;
-      i += 4;
-    }
-  return i + table[x & 0xf];
+  return i + table[128 + (x & 0xff) - (x >> 8)];
 }
 
 /* Returns size if there's no more bits set */
@@ -204,7 +207,7 @@ main (int argc, char **argv)
 	return EXIT_FAILURE;
       case 'b':
 	{
-	  long arg = atoi(optarg);
+	  long arg = atol(optarg);
 	  if (arg <= 10)
 	    {
 	      usage();
@@ -224,7 +227,7 @@ main (int argc, char **argv)
     limit = 1000;
   else if (argc == 1)
     {
-      limit = atoi(argv[0]);
+      limit = atol(argv[0]);
       if (limit < 2)
 	return EXIT_SUCCESS;
     }
@@ -239,7 +242,10 @@ main (int argc, char **argv)
   if (!block_size || block_size > size)
     block_size = size;
 
-  vector = vector_alloc (size);
+  /* FIXME: Allocates a bit for all odd numbers up to limit. Could
+     save a lot of memory by allocating space only for numbers up to
+     the square root, plus one additional block. */
+  vector = vector_alloc(size);
   if (!vector)
     {
       fprintf(stderr, "Insufficient memory.\n");