File: /usr/include/linux/bitops.h

1     #ifndef _LINUX_BITOPS_H
2     #define _LINUX_BITOPS_H
3     
4     
5     /*
6      * ffs: find first bit set. This is defined the same way as
7      * the libc and compiler builtin ffs routines, therefore
8      * differs in spirit from the above ffz (man ffs).
9      */
10     
11     static inline int generic_ffs(int x)
12     {
13     	int r = 1;
14     
15     	if (!x)
16     		return 0;
17     	if (!(x & 0xffff)) {
18     		x >>= 16;
19     		r += 16;
20     	}
21     	if (!(x & 0xff)) {
22     		x >>= 8;
23     		r += 8;
24     	}
25     	if (!(x & 0xf)) {
26     		x >>= 4;
27     		r += 4;
28     	}
29     	if (!(x & 3)) {
30     		x >>= 2;
31     		r += 2;
32     	}
33     	if (!(x & 1)) {
34     		x >>= 1;
35     		r += 1;
36     	}
37     	return r;
38     }
39     
40     /*
41      * hweightN: returns the hamming weight (i.e. the number
42      * of bits set) of a N-bit word
43      */
44     
45     static inline unsigned int generic_hweight32(unsigned int w)
46     {
47             unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
48             res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
49             res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F);
50             res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF);
51             return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF);
52     }
53     
54     static inline unsigned int generic_hweight16(unsigned int w)
55     {
56             unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555);
57             res = (res & 0x3333) + ((res >> 2) & 0x3333);
58             res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F);
59             return (res & 0x00FF) + ((res >> 8) & 0x00FF);
60     }
61     
62     static inline unsigned int generic_hweight8(unsigned int w)
63     {
64             unsigned int res = (w & 0x55) + ((w >> 1) & 0x55);
65             res = (res & 0x33) + ((res >> 2) & 0x33);
66             return (res & 0x0F) + ((res >> 4) & 0x0F);
67     }
68     
69     #include <asm/bitops.h>
70     
71     
72     #endif
73