From 40d6c6684861d597f8e6d76d99200734c89480ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Sat, 5 Jan 2008 23:56:07 +0100 Subject: [PATCH] (find_first_one): Optimized, using slightly larger table. (main): Use atol, arther than atoi. Rev: nettle/examples/eratosthenes.c:1.8 --- examples/eratosthenes.c | 48 +++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/examples/eratosthenes.c b/examples/eratosthenes.c index fd38ca7d..97abe191 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"); -- GitLab