summaryrefslogtreecommitdiff
path: root/ipl/cfuncs/bitcount.c
blob: c6a5be64376d236e60f612fcbfa09cd1d9ec27f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
############################################################################
#
#	File:     bitcount.c
#
#	Subject:  Function to count bits in an integer
#
#	Author:   Gregg M. Townsend
#
#	Date:     April 9, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  bitcount(i) returns the number of bits that are set in the integer i.
#  It works only for "normal" integers, not large integers.
#
############################################################################
#
#  Requires:  Dynamic loading
#
############################################################################
*/

#include "icall.h"

int bitcount(int argc, descriptor *argv) /*: count bits in an integer */
   {
   unsigned long v;
   int n;

   ArgInteger(1);			/* validate type */

   v = IntegerVal(argv[1]);		/* get value as unsigned long */
   n = 0;
   while (v != 0) {			/* while more bits to count */
      n += v & 1;			/*    check low-order bit */
      v >>= 1;				/*    shift off with zero-fill */
      }

   RetInteger(n);			/* return result */
   }