Skip to content

Commit

Permalink
Add hweight64()
Browse files Browse the repository at this point in the history
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe committed Jan 21, 2013
1 parent 671b060 commit def823d
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
14 changes: 14 additions & 0 deletions lib/hweight.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,17 @@ unsigned int hweight32(uint32_t w)
res = res + (res >> 8);
return (res + (res >> 16)) & 0x000000FF;
}

unsigned int hweight64(uint64_t w)
{
#if BITS_PER_LONG == 32
return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w);
#else
uint64_t res = w - ((w >> 1) & 0x5555555555555555ul);
res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful;
res = res + (res >> 8);
res = res + (res >> 16);
return (res + (res >> 32)) & 0x00000000000000FFul;
#endif
}
1 change: 1 addition & 0 deletions lib/hweight.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@

unsigned int hweight8(uint8_t w);
unsigned int hweight32(uint32_t w);
unsigned int hweight64(uint64_t w);

#endif

0 comments on commit def823d

Please sign in to comment.