Version:  2.0.40 2.2.26 2.4.37 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10

Linux/lib/hweight.c

  1 #include <linux/export.h>
  2 #include <linux/bitops.h>
  3 #include <asm/types.h>
  4 
  5 /**
  6  * hweightN - returns the hamming weight of a N-bit word
  7  * @x: the word to weigh
  8  *
  9  * The Hamming Weight of a number is the total number of bits set in it.
 10  */
 11 
 12 #ifndef __HAVE_ARCH_SW_HWEIGHT
 13 unsigned int __sw_hweight32(unsigned int w)
 14 {
 15 #ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER
 16         w -= (w >> 1) & 0x55555555;
 17         w =  (w & 0x33333333) + ((w >> 2) & 0x33333333);
 18         w =  (w + (w >> 4)) & 0x0f0f0f0f;
 19         return (w * 0x01010101) >> 24;
 20 #else
 21         unsigned int res = w - ((w >> 1) & 0x55555555);
 22         res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
 23         res = (res + (res >> 4)) & 0x0F0F0F0F;
 24         res = res + (res >> 8);
 25         return (res + (res >> 16)) & 0x000000FF;
 26 #endif
 27 }
 28 EXPORT_SYMBOL(__sw_hweight32);
 29 #endif
 30 
 31 unsigned int __sw_hweight16(unsigned int w)
 32 {
 33         unsigned int res = w - ((w >> 1) & 0x5555);
 34         res = (res & 0x3333) + ((res >> 2) & 0x3333);
 35         res = (res + (res >> 4)) & 0x0F0F;
 36         return (res + (res >> 8)) & 0x00FF;
 37 }
 38 EXPORT_SYMBOL(__sw_hweight16);
 39 
 40 unsigned int __sw_hweight8(unsigned int w)
 41 {
 42         unsigned int res = w - ((w >> 1) & 0x55);
 43         res = (res & 0x33) + ((res >> 2) & 0x33);
 44         return (res + (res >> 4)) & 0x0F;
 45 }
 46 EXPORT_SYMBOL(__sw_hweight8);
 47 
 48 #ifndef __HAVE_ARCH_SW_HWEIGHT
 49 unsigned long __sw_hweight64(__u64 w)
 50 {
 51 #if BITS_PER_LONG == 32
 52         return __sw_hweight32((unsigned int)(w >> 32)) +
 53                __sw_hweight32((unsigned int)w);
 54 #elif BITS_PER_LONG == 64
 55 #ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER
 56         w -= (w >> 1) & 0x5555555555555555ul;
 57         w =  (w & 0x3333333333333333ul) + ((w >> 2) & 0x3333333333333333ul);
 58         w =  (w + (w >> 4)) & 0x0f0f0f0f0f0f0f0ful;
 59         return (w * 0x0101010101010101ul) >> 56;
 60 #else
 61         __u64 res = w - ((w >> 1) & 0x5555555555555555ul);
 62         res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
 63         res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful;
 64         res = res + (res >> 8);
 65         res = res + (res >> 16);
 66         return (res + (res >> 32)) & 0x00000000000000FFul;
 67 #endif
 68 #endif
 69 }
 70 EXPORT_SYMBOL(__sw_hweight64);
 71 #endif
 72 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us