二进制字符串到 int 仅有时有效

binary string to int works only sometimes

所以我有一个代码可以获取两个整数,将它们转换为 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));
}

但我面临的问题是在 BintoDec 函数中。

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;
}

它应该输出一个转换后的二进制整数,当我输入一个格式化为 {0,0,...,1,0,0}(输出 4)的 int[32] 字符串时它会输出,但是如果我放入第一个代码(dahcw)的输出,它只是吐出一个似乎是随机整数的东西。 抱歉我的英语不好,这是我的第二语言。

编辑:出于调试目的,我已将 printf 语句放入我的 BintoDec 函数中,但它将 decimal += 1 << position; 推出了 if 语句,从而阻止了该函数。 快速解决方法是删除 printf 语句,但我确实更喜欢@Fiddling Bits 对使用无符号整数而不是普通整数的回答。

而关于中继功能的这部分 ctrl == 0 || -1 必须更改为 ctrl == -1 || 0,但由于某些原因,它在没有修复的情况下仍然有效。

如果 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

我想我已经弄明白了!

BintoDec 函数以这种方式接受字符串。例如,数字 4 是 int a[32]={0,0,...,0,0,1,0,0},表示a[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。

所以,我基本上需要代码来翻转字符串,以便 BintoDec 函数可以正确解释字符串。

int fdahcw[32];
for (int i = 0; i < 32; i++) {
    fdahcw[31 - i] = dahcw[i];
}