// comptech.cpp  17.6.96
//
// Программа преобразует код 16-ти разрядного слова
// таким образом, что число единиц во входном слове
// заменяется на последовательностью нулей в выходном
// 16-ти разрядном слове. Нули справа.
//
// Останов происходит, когда во входном слове не остается единиц

#include <conio.h>
#include <stdio.h>

void main(void)
  {
  union WORD16
    {
    int sw;
    char sb[2];
    };
  WORD16 x; // input code [BC]
  WORD16 y; // output code[DE]
  WORD16 t; // accumulator[AF]

  //clrscr();
  printf("\n\n\n\n*******************");
  printf("\n                  h");
  printf("\r input word x=");
  scanf("%x",&x.sw);
  y.sw=-1;

  while(x.sw != 0)
    {
    //
    t.sw=0;
    // (b)->(a)
    t.sb[1]=x.sb[1];
    // RAR a
    t.sw/=2;
    x.sb[1]=0x00;
    x.sb[1]=t.sb[1]&0x07f;
    if(t.sb[0]&0x80)
      {
      // CY=1
      t.sb[1]=0x01;
      }
    else
      {
      // CY=0
      t.sb[1]=0x00;
      }
    // (c)->(a)
    t.sb[0]=x.sb[0];
    // RAR a
    t.sw/=2;
    if(x.sb[0]&0x01)
      {
      // CY=1
      x.sb[0]=t.sb[0];
      // (e)->(a)
      t.sw=y.sw;
      // RAL a
      t.sw*=2;
      y.sw=t.sw;
      }
    else
      {
      // CY=0
      x.sb[0]=t.sb[0];
      }
    }
  printf("output word y=%xh",y.sw);
  getch();
  return;
  } // end main
