двоичная строка в int работает только иногда - PullRequest
0 голосов
/ 13 апреля 2020

Итак, у меня есть код, который получает два целых числа, преобразует их в строки 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, но по какой-то причине все еще работало без исправления.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Думаю, я понял это!

Функция BintoDe c принимает строки таким образом. Например, число 4 равно int a[32]={0,0,...,0,0,1,0,0}, что означает, что [29] равно 1, а все остальные числа равны 0.

Но я преобразовывал целое число в двоичную строку, используя этот фрагмент кода.

for (int i = 31; i >= 0; i--) {
     mask = 1 << i;
     ahcw[i] = input & mask ? 1 : 0;
}

, который, если бы он конвертировал 4, получился бы со строкой, подобной этой {0,0,1,0,0,...,0,0}, что означает, что ahcw [2] равно 1, а каждое другое число равно 0.

Мне в основном нужен был код для переворачивания строки, чтобы функция BintoDe c могла правильно интерпретировать строку.

int fdahcw[32];
for (int i = 0; i < 32; i++) {
    fdahcw[31 - i] = dahcw[i];
}
0 голосов
/ 13 апреля 2020

Если BintoDec является вашей единственной проблемой, которая, вероятно, не соответствует @Govind Parmar, это должно решить вашу проблему:

#include <stdio.h>

unsigned int BintoDec(int binary[], int length)
{
    unsigned int decimal = 0;

    for (int i = 0; i < length; i++)
    {
        if(binary[i] == 1)
            decimal |= (1 << (length - i - 1));
    }

    return decimal;
}

int main(void)
{
    int binary[32] = {1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1};
    unsigned int decimal;

    for(int i = 0; i < 32; i++)
    {
        printf("%d", binary[i]);
        if((i != 0) && (((i + 1) % 4) == 0) && (i != 31))
            printf(", ");
    }
    printf("\n");
    decimal = BintoDec(binary, 32);
    printf("0x%08X\n", decimal);

    return 0;
}

Вывод:

$ gcc main.c -o main.exe; ./main.exe
1101, 1110, 1010, 1101, 1011, 1110, 1110, 1111
0xDEADBEEF
...