/*
  Name:  Anders Bjerg Pedersen
  E-mail: Anders.P@math.ku.dk
*/

#include <stdio.h>

	/* Vi bruger den rettede udgave af programmet base2 fra ugeopgaverne til at konvertere
	 * vores char til binær repræsentation. Det skal her bemærkes, at vi kun tæller i 
	 * UNSIGNED input (jfr. opgavespecifikationen): */
	 
unsigned int one_bits(unsigned char b) {
     /* Denne funktion tæller antallet af 1-bits i byte b */

     unsigned int count = 0;
  	 unsigned int exp = 1;
	 int k;

	 /* Beregn den højest mulige potens af 2 (2^7 for en char i vores tilfælde). */
  
	 for (k = 0; k < 7; ++k) {
		 exp = exp * 2;
	 }

	 /* For hver potens af 2 (fra 7 til og med 0) incrementer vi count, hvis tallet
	  * er indeholdt i b, ellers trækker vi tallet fra og gentager proceduren: */

	 for (k = 7; k >= 0; --k) {
		 if (b >= exp) {
           ++count;
           b = b - exp;
         } 
     exp = exp / 2;
     }
  return count;
};

unsigned int bit_count(char a[]) {
  /* Denne funktion tæller antallet af 1-bits i character arrayet a: */

  unsigned int count = 0;
  unsigned int i = 0;
  /* Add your code here */
  
  while (a[i] != '\0') {
    count += one_bits(a[i]);
	++i;
  }
  return count;
};
  
int main() {
  /* Tests af begge funktioner: */

  unsigned char n = 0;
  unsigned char k = 32;
  unsigned char m = 255;
  char d[] = "\n";
  char e[] = "";
  char f[] = "\\n";
  char g[] = "(";
  char h[] = "hello!";
  char q[] = "bye!";

  printf("number of 1-bits in byte %u is %d, should be 0\n", n, one_bits(n));
  printf("number of 1-bits in byte %u is %d, should be 1\n", k, one_bits(k));
  printf("number of 1-bits in byte %u is %d, should be 8\n", m, one_bits(m));

  printf("number of 1-bits in \'%s\' is %d, should be 2\n", d, bit_count(d));
  printf("number of 1-bits in \'%s\' is %d, should be 0\n", e, bit_count(e));
  printf("number of 1-bits in \'%s\' is %d, should be 9\n", f, bit_count(f));
  printf("number of 1-bits in \'%s\' is %d, should be 2\n", g, bit_count(g));
  printf("number of 1-bits in \'%s\' is %d, should be 23\n", h, bit_count(h));
  printf("number of 1-bits in \'%s\' is %d, should be 14\n", q, bit_count(q));

  return 0;
}


