C言語で半加算器、全加算器を書いてみました。 入力ビット列がA[]とB[]、結果ビット列がS[]になります。

adder.c (Gist)

#include <stdio.h>

/* ANDゲート */
int and_gate(int A, int B)
{
  return A && B ? 1 : 0;
}

/* ORゲート */
int or_gate(int A, int B)
{
  return A || B ? 1 : 0;
}

/* NOTゲート */
int not_gate(int A)
{
  return A ? 0 : 1;
}

/* XORゲート */
int xor_gate(int A, int B)
{
  return A != B ? 1 : 0;
}

/* 半加算器 */
void half_adder(int A, int B, int* C, int* S)
{
  *C = and_gate(A, B);
  *S = xor_gate(A, B);
}

/* 全加算器 */
void full_adder(int A, int B, int X, int* C, int* S)
{
  int C2;
  half_adder(A, B, C, S);
  half_adder(*S, X, &C2, S);
  *C = or_gate(*C, C2);
}

/* 複数ビット加算器 */
void multibit_adder(int A[], int B[], int* C, int S[], int nb)
{
  int i;
  for (i=0; i<nb; i++) {
    if (i)
      full_adder(A[i], B[i], *C, C, &S[i]);
    else
      half_adder(A[i], B[i], C, &S[i]);
  }
}

/* 複数ビット減算器 */
void multibit_subber(int A[], int B[], int* C, int S[], int nb)
{
  int i;
  *C = 1;
  for (i=0; i<nb; i++) {
    full_adder(A[i], not_gate(B[i]), *C, C, &S[i]);
  }
}

int main()
{
  int a[] = {0, 0, 0, 0, 0, 0, 0, 0};
  int b[] = {0, 0, 0, 0, 0, 0, 0, 0};
  int s[] = {0, 0, 0, 0, 0, 0, 0, 0};
  int c;

  multibit_subber(a, b, &c, s, 8);

  printf("c= %d\ns= ", c);
  for (int i=0; i<8; i++)
    printf("%d ", s[i]);
  puts("");

  return 0;
}