我有一份功课。问题是:
编写一个函数,将一个整数,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;
}
答案 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。