This source file includes following definitions.
- naive
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <config.h>
19
20 #include <string.h>
21
22 #include "signature.h"
23 SIGNATURE_CHECK (ffsll, int, (long long int));
24
25 #include <limits.h>
26
27 #include "macros.h"
28
29 #define NBITS (sizeof (long long int) * CHAR_BIT)
30
31 static int
32 naive (long long int i)
33 {
34 unsigned long long int j;
35 for (j = 0; j < NBITS; j++)
36 if (i & (1ULL << j))
37 return j + 1;
38 return 0;
39 }
40
41 int
42 main (int argc, char *argv[])
43 {
44 long long int x;
45 int i;
46
47 for (x = -128; x <= 128; x++)
48 ASSERT (ffsll (x) == naive (x));
49 for (i = 0; i < NBITS; i++)
50 {
51 ASSERT (ffsll (1ULL << i) == naive (1ULL << i));
52 ASSERT (ffsll (1ULL << i) == i + 1);
53 ASSERT (ffsll (-1ULL << i) == i + 1);
54 }
55 for (i = 0; i < NBITS - 1; i++)
56 {
57 ASSERT (ffsll (3ULL << i) == i + 1);
58 ASSERT (ffsll (-3ULL << i) == i + 1);
59 }
60 for (i = 0; i < NBITS - 2; i++)
61 {
62 ASSERT (ffsll (5ULL << i) == i + 1);
63 ASSERT (ffsll (-5ULL << i) == i + 1);
64 ASSERT (ffsll (7ULL << i) == i + 1);
65 ASSERT (ffsll (-7ULL << i) == i + 1);
66 }
67 return 0;
68 }