使用unsigned char和无字符串将十进制转换为16位二进制

时间:2018-05-16 09:53:41

标签: c unsigned 16-bit accumulator alu

如果我将操作数1和操作数2用作整数,则我的代码有效。使用unsigned char操作数1不起作用。你能救我吗?

int ALU(unsigned char operand1, unsigned char operand2)
{
printf("Enter Operand 1(in decimal): ");
scanf("%d",&operand1);
printf("\nEnter Operand 2(in decimal): ");
scanf("%d",&operand2);

char bin16_1[]  = "0000000000000000";
int pos;
for (pos = 16; pos >= 0; --pos)
{
    if (operand1 % 2) 
    bin16_1[pos] = '1';
    operand1 /= 2;
}
printf("\n\nBinary Equivalence of Operand 1: %s",bin16_1);

如果输入4096或512或65536作为十进制,输出将为0000 0000 0000 00000,这是错误的。

2 个答案:

答案 0 :(得分:1)

char *reverse(char *str)
{
    size_t len = strlen(str);

    for (size_t pos = 0; pos < len / 2; pos++)
    {
        char tmp = str[pos];

        str[pos] = str[len - 1 - pos];
        str[len - 1 - pos] = tmp;
    }
    return str;
}

char *toBin(char *buff, uint16_t value, int pad)
{
    size_t nbits = 16;
    char *work_buff = buff;
    do
    {
        *work_buff++ = value & 1 ? '1' : '0';
        value >>= 1;
        nbits--;
    }while(value);
    if (pad)
    {
        while (nbits--)
        {
            *work_buff++ = '0';
        }
    }
    *work_buff = 0;
    return reverse(buff);
}

答案 1 :(得分:-1)

您的解决方案不起作用,因为您无法对未签名的字符执行此类操作。您应用的算术运算在带有十进制基数的数字上,但是无符号字符属于二进制数。

因此,不应检查模数并将输入除以2,而应该在当前最重要的位和1.代码之间执行移位和二进制比较:

正确的解决方案:

for( int i = 7; i >= 0; i-- ) {
    bin16_1[i] = (operand1 >> i) & 1 ? 1 : 0;
}

<强>解释

每次迭代时,通过移位和二进制比较,从字节读取最高有效位。

例如,假设输入值为128,二进制转换为1000 0000.将其移动7将给出0000 0001,因此得出结论:最高有效位为1. 0000 0001&amp; 1 = 1.这是在控制台中打印的第一个位。下一次迭代将导致0 ... 0。