2
/*@ axiomatic CountBits {
3
@ // the i-th bit of x as 0 or 2^i
4
@ logic integer bit(integer x, integer i);
5
@ // the number of bits 1 in x
6
@ logic integer nbits(integer x);
7
@ axiom nbits_nonneg : \forall integer x; nbits(x) >= 0;
8
@ axiom nbits_zero : nbits(0) == 0;
9
@ // the lowest bit 1 in x
10
@ logic integer lowest_bit(integer x);
11
@ axiom lowest_bit_def :
12
@ \forall integer x; x != 0 ==>
15
@ lowest_bit(x) == bit(x,i) &&
17
@ \forall integer j; 0 <= j < i ==> bit(x,j) == 0;
18
@ axiom lowest_bit_zero :
19
@ \forall integer x; lowest_bit(x) == 0 <==> x == 0;
20
@ axiom lowest_bit_trick :
21
@ \forall integer x; (x & -x) == lowest_bit(x);
22
@ axiom remove_one_bit :
23
@ \forall integer x, integer i;
24
@ bit(x,i) != 0 ==> nbits((int)(x - bit(x,i))) == nbits(x) - 1;
28
/*@ ensures \result == nbits(x); */
29
int count_bits(int x) {
31
/*@ loop invariant c + nbits(x) == nbits(\at(x,Pre));
32
@ loop variant nbits(x);
34
for (c = 0; d = x&-x; x -= d) c++;
41
compile-command: "LC_ALL=C make count_bits"