Итак, у меня есть код, который получает два целых числа, преобразует их в строки int [32] и делает больше с помощью имитированной схемы полного сумматора (это для реализации ее в схеме Arduino).
Это весь код:
#include<stdio.h>
int relay(int ctrl, int input, int mode) {
printf(" Relay used ");
if (mode == 0) {
if (ctrl == 1 && (input == -1 || 1)) {
return input;
}
else
return 0;
}
else if (mode == 1) {
if ((ctrl == 0 || -1) && (input == -1 || 1)) {
return input;
}
else
return 0;
}
printf("ERR ON FUNCTION relay");
return 10000;
}//Relay circuit simulation(mode 0=naturally open,mode 1=naturally closed)
int andgate(int in1, int in2) {
printf(" AND gate used (");
int relayout = relay(in1, in2, 0);
printf(")");
if (relayout <= 0)
return 0;
else if (relayout == 1)
return 1;
printf("ERR ON FUNCTION andgate");
return 10000;
}//AND Gate circuit simulation
int orgate(int in1, int in2) {
printf(" OR Gate used ");
if (in1 || in2 == 1)
return 1;
else
return 0;
printf("ERR ON FUNCTION orgate");
return 10000;
}//OR Gate circuit simulation
int nandgate(int in1, int in2) {
printf(" NAND gate used (");
if (relay(in1, relay(in2, -1, 0), 0) == -1) {
printf(")");
return 0;
}
else if (relay(in1, relay(in2, -1, 0), 0) == 0) {
printf(")");
return 1;
}
printf("ERR ON FUNCTION nandgate");
return 10000;
}//NAND Gate circuit simulation
int xorgate(int in1, int in2) {
printf(" XOR gate used (");
int orout, nandout;
orout = orgate(in1, in2);
nandout = nandgate(in1, in2);
printf(")");
return andgate(orout, nandout);
printf("ERR ON FUNCTION xorgate");
return 10000;
}//XOR Gate circuit simulation
int hout, hc;
void hadder(int in1, int in2) {
printf(" Half adder used (");
//hout,hc : hadder output
hout = xorgate(in1, in2);
hc = andgate(in1, in2);
printf(")");
}//Half adder circuit simulation
int fout, fc;
void fadder(int in1, int in2, int c) {
printf(" Full adder used (");
int hout1, hc1;//hout,hc : hadder output, fout,fc : fadder output
hadder(in1, in2);
hout1 = hout; hc1 = hc;
hout = 0; hc = 0;
hadder(hout1, c);
fout = hout;
fc = orgate(hc1, hc);
printf(")");
}//Full adder circuit simulation
int lcheck(int leanth, int check[]) {
int bincheck[2] = { 0, };
for (int i = 0; i < leanth; i++) {
if (check[i] == 0 && bincheck[0] == 0) {
bincheck[0] = 1;
bincheck[1] = i;
}
else if (check[i] == 1) {
bincheck[0] = 0;
}
}
return bincheck[1];
}
int BintoDec(int binary[], int leangth/*unused*/)
{
int decimal = 0;
int position = 0;
for (int i = 31; i >= 0; i--)
{
if (binary[i] == 1)
printf("\n%d %d", binary[i], position);
decimal += 1 << position;
position++;
}
return decimal;
}
int main() {
int input = 0, input2 = 0;
int mask;
int ahcw[32] = { 0, }, ahcw2[32] = { 0, }, pahcw[32] = { 0, }, dahcw[32] = { 0, };
int lahcw, lahcw2, ldahcw, ssum;
printf("Input Number:");
scanf_s("%d", &input);
printf("Input Number:");
scanf_s("%d", &input2);
for (int i = 31; i >= 0; i--) {
mask = 1 << i;
ahcw[i] = input & mask ? 1 : 0;
}
lahcw = lcheck(32, ahcw);
printf("\n\n%d\n\n", lahcw);
for (int i = 31; i >= 0; i--) {
mask = 1 << i;
ahcw2[i] = input2 & mask ? 1 : 0;
}
lahcw2 = lcheck(32, ahcw);
if (lahcw >= lahcw2)
ssum = lahcw;
else
ssum = lahcw2;
for (int i = 0; i < ssum + 1; i++) {
fadder(ahcw[i], ahcw2[i], pahcw[i]);
dahcw[i] = fout;
pahcw[i + 1] = fc;
}
ldahcw = lcheck(32, dahcw);
printf("%d ", ldahcw);
for (int i = 31; i >= 0; i--) { printf("%d", dahcw[i]); if (i % 8 == 0) printf(" "); }
printf("\n\n\n\n\n\n%d", BintoDec(dahcw, 33));
}
, но проблема, с которой я сталкиваюсь, заключается в функции BintoDe c.
int BintoDec(int binary[], int leangth/*unused*/)
{
int decimal = 0;
int position = 0;
for (int i = 31; i >= 0; i--)
{
if (binary[i] == 1)
printf("\n%d %d", binary[i], position);
decimal += 1 << position;
position++;
}
return decimal;
}
, которая должна выводить преобразованное двоичное целое число, которое происходит при Я вставил строку int [32] в формате {0,0, ..., 1,0,0} (вывод 4), но если я поместил вывод первого кода (dahcw), он просто выплевывает, что кажется случайным целым числом. Извините за мой плохой Engli sh, это мой второй язык.
Редактировать: я поместил оператор printf в мою функцию BintoDe c для целей отладки, но он вытолкнул decimal += 1 << position;
из оператора if , тормозя функцию. Быстрым решением было бы удалить оператор printf, но я предпочитаю ответ @Fiddling Bits для использования беззнаковых целых вместо обычных целых.
И эту часть в функции реле ctrl == 0 || -1
пришлось изменить до ctrl == -1 || 0
, но по какой-то причине все еще работало без исправления.