hab auch gebastelt, komme aber mit meiner lösung zu spät. ausserdem ist sie nicht so elegant, und ob es funktioniert, konnte ich nur mit den wiki-beispielen testen.. -.-
Code:
#include <stdio.h>
#include <conio.h> // nur fuer getch

int main(void)
{
  unsigned int i,pos=1,ergebnis=0,x=15;
  printf("Wert x=%d wird aufgeloest:\n",x);
  for(i=0;i<32;i++)
  {
    int v=((x&(1<<(31-i)))<<1);
    if(v)
    {
      v--;
      if(pos)ergebnis+=v;
      else ergebnis-=v;
      printf("%d=%d\n",i,v);
      pos=!pos;
    }
  }
  printf("ergebnis:%d\n",ergebnis);
  getch();
  return 0;
}
EDIT @sprinter-code:
binär 1111 ist doch 15, da bekommst du 8 raus, in der Wiki steht 10..
stimmt die Wiki nicht oder dein code? *fragend guck*