Генератор таблиц истинности (на языке Си)
Материал из Модулярная арифметики
Код на Си
/*
Генератор таблиц истинности для сумматоров по модулю
*/
#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;
}