看这篇文章前,可以先看一下另一篇文章(关于取出二进制和十进制中的每一位)
这里我们只讨论无符号二进制
一:数字型(从左向右)
这里说的数字型是用户(即对计算机不太了解的人)输入101,但其实 输入的 101 是字符。
int main()
{
int n = 0;
int sum = 0;
int p = 1; //n为二进制数,sum为每一位计算所加的和,p为位权
scanf("%d", &n); //输入该二进制数
while (n) //循环条件为n,即二进制数n在不为0的时候程序一直成立
{ sum += (n % 10) * p; //数字中所有位乘以本位的位权再加和
p *= 2; //位权随着位的变化依次增加
n /= 10; //进行下一位的输出
}
printf("%d\n", sum);
return 0;
}
scanf() 函数的声明。
int scanf(const char *format, ...)
返回值
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
从上面了解到,我们从 黑框框(终端(也称为控制台或命令提示符))中通过键盘输入的实际是字符串或字符,而scanf函数,将我们输入的字符串或字符转化成了想要的格式(如 int 、char)
例如,在上述代码中我们运行程序后输入 101 ,其实输入的是字符串 "101",然后通过scanf转化成int储存在 变量 n 中而且 整数101 在计算机中是用二进制(1100101)储存的,我们通过对
int 101 操作,转化成了 对应的十进制数 int 5.
二:字符型(字符数组)(从右向左)
首先,我们先了解这个代码
int main()
{
printf("%d\n", '0');//对应ASCII码表 int 48
printf("%d\n", 0);//就是 int 0
return 0;
}
然后,
int main()
{
char binary[100];
scanf("%s", binary);
char* p = binary;
unsigned long long decimal = 0;
while (*p)//我们是通过scanf("%s", binary);获取的字符串,是以 '\0' 作为结束标志的
{
decimal = (decimal << 1) + (*p - '0');
p++;
}
printf("%lld\n", decimal);
return 0;
}
关键算法是
while (*p)//我们是通过scanf("%s", binary);获取的字符串,是以 '\0' 作为结束标志的
{
decimal = (decimal << 1) + (*p - '0');
p++;
}
例如,输入 101 存放进 char binary[100]; 1 0 1
从右往左取出每一位
总结,把字符转化成数字,然后才能做运算。