关于C中位序列的作业

时间:2011-10-23 11:22:14

标签: c bit-manipulation

我有一份功课。问题是:

编写一个函数,将一个整数,int输入作为参数,并返回一个无符号字符 这样: a-如果输入为负数或大于11,111,111或包含不为0或1的数字;然后功能会 打印错误消息(例如“无效输入”)并返回0, b-否则;该函数将假设输入的base-10值表示一个位序列,并返回该序列对应的仅幅度位模型。

例如:如果输入为1011,则返回值为11,如果输入为1110,则返回值为14

这是我的工作,我被困在b上。如何获得给定整数输入的位序列?

int main()
{
    int input = 0;

printf("Please type an integer number less than 11,111,111.\n");
scanf("%d",&input);

if(input < 0 || input > 11111111)
{
    printf("Invalid Input\n");
    system("PAUSE");
    return 0;
}


for (int i = 0; i < 8; i++)
{
    int writtenInput = input;
    int single_digit = writtenInput%10;

    if(single_digit == 0 || single_digit == 1)
    {
        writtenInput /= 10;
    }
    else
    {
        printf("Your digit contains a number that does not 0 or 1. it is invalid input\n");
    system("PAUSE");
    return 0;
    }
}

printf("Written integer is %d\n",input);

system("PAUSE");
return 0;
}

3 个答案:

答案 0 :(得分:1)

您缺少的是基本转换。要解释基数B中的数字,你需要做的是将数字N乘以B ^ N(假设你开始计算最不重要的数字)。例如,在基数16中,A108 = (10)*16^3 + 1*16^2 + 0*16^1 + 8*16^0。基数为2(二进制)的位置。

或者,如果将表达式重写为:

,则可以避免取幂
hex A008 = ((((10*16) + 1)*16 +0)*16 + 8

如果您的输入是根据可能未知长度的数组来表示的话会更简单,因为它很容易转换为只有加法和乘法的循环。

在二进制的特定情况下,您可以使用另一个直接解决方案,对于非零的每个数字,将相应位设置为足够大的整数类型(在您的情况下,unsigned char就足够了),以及循环结束时变量的值将是转换的结果。

答案 1 :(得分:0)

首先,代码的现有部分需要工作。它不会正确报告非二进制数字。问题是“是否有任何数字既不是0也不是1”。要回答这个问题,你需要检查每一个数字。您的代码可以提前终止。我还建议将功能重命名为能够清楚地告诉您功能的内容。例如haveNonBinaryDigit。术语check并不能告诉您对返回值的期望。

至于第二部分,请阅读二进制表示。它与十进制非常相似,只是不是每个数字加权1,10,100,...,10 ^ x,它们的加权为1,2,4,...,2 ^ n。数字也只能有0和1的值。

答案 2 :(得分:0)

您当前的代码有一个问题:它会在找到一个单独的二进制位(在结尾处)时立即终止并调用整个整数。

我会采取不同的方法解决这个问题。你想要做的是单独从整数中获取每一个数字。你通过使用modulo开始这样做。说你有这个代码:

for (int i = 0; i < 8; i++)
{
    char single_digit = input%10;
    input /= 10;
}

这使得开始使用数字变得容易。您将检查8位,因为这似乎是允许的最大值(11,111,111)。检查每个数字是0还是1.然后您可以使用按位运算将其推入无符号字符。通过 i 向左移位每个数字,然后使用按位OR。