Генератор таблиц истинности (на языке Си)

Материал из Модулярная арифметики
Перейти к: навигация, поиск

Код на Си

/*
Генератор таблиц истинности для сумматоров по модулю
*/

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int get_bit(int x, int pos) {
	return (x >> pos) & 1;
}

int set_bit(int x, int bit_val, int pos) {
	if (bit_val == 1)
		return (x | (1 << pos));
	else
		return (x & ~(1 << pos));
}

int invert_bit(int x) {
	if (x == 1)
		return 0;
	else
		return 1;
}

int find_bit(int p) {
	int i, k;
	k = 1;
	for (i = 0; i < 32; i++) {
		if (k > p)
			return i;
		k *= 2;
	}
	return -1;
}

int pow2(int p) {
	return (1 << p);
}

void print_sum_mod(FILE *out, int p) {
	int i, k;
	int a, b;
	int bit, max, max2;
	int val, res;
	
	bit = find_bit(p-1);
	max = pow2(bit);
	max2 = pow2(2*bit);

	for (i = 0; i < bit; i++)
		fprintf(out, "A%d,", i);
	for (i = 0; i < bit; i++)
		fprintf(out, "B%d,", i);
	for (i = 0; i < bit; i++)
		fprintf(out, ",X%d", i);
	fprintf(out, "\n");
	
	// Заполняем минтермы
	for (i = 0; i < max2; i++) {
		a = 0;
		for (k = bit-1; k >= 0; k--) {
			val = get_bit(i, k);
			a += val*pow2(k);
			fprintf(out, "%d,", val);
		}
		b = 0;
		for (k = bit-1; k >= 0; k--) {
			val = get_bit(i, bit + k);
			b += val*pow2(k);
			fprintf(out, "%d,", val);
		}
		res = (a + b)%p;
		if (a >= p || b >= p) {
			for (k = bit-1; k >= 0; k--) {
				fprintf(out, ",X");
			}
		} else {
			for (k = bit-1; k >= 0; k--) {
				fprintf(out, ",%d", get_bit(res, k));
			}
		}
		fprintf(out, "\n");
	}
}


int main ()
{
	FILE *out;
	int i, num, mod;
	char buf[255];
	
	for (i = 3; i < 256; i++) {
		sprintf(buf, "res_sum/sum_mod_%d.csv", i);
		out = fopen(buf, "w");
		print_sum_mod(out, i);
		fclose(out);
	}
	
	
	return 0;
}

Результат работы