每一位"/>
利用权值获取各种进制数据的每一位
目录
输出一个整数的每一位
理解十进制权值:
那么计算机中最常见的二进制是否也是如此呢?
理解了以上十进制中位数和权值的关系,这个问题就很简单了
总结一下
c语言中有一个经典问题:输出一个整数的每一位
比如输出1234的每一位:
方法很简单:
1234%10==4;这样就获得了个位
1234/10=123;这样就把十位的数放在了个位
然后只要利用递归先进后出就可以从最高位开始打印
代码如下
//输出一个整数的每一位。
void print(int num)
{if (num < 10)printf("%d", num);else{print(num / 10);printf("%d", num % 10);}//由于先进后出,个位最后打印
}
int main()
{int num = 0;scanf("%d", &num);print(num);
}
可以看见这里取模和除法运算与‘十’密不可分
关于这一点可以利用权值理解:
在十进制中,1234中4的权值是1,3的权值是10
这个数除以十得到123(个位数被舍去),3的权值变成了1,也就是3*10变成了3*1
这时再次%10自然就能得到权值为1的个位了
那么计算机中最常见的二进制是否也是如此呢?
还是借助一个经典问题
写一个函数返回参数二进制中 1的个数
理解了以上十进制中位数和权值的关系,这个问题就很简单了
来看原理1011/2==101,111/2==10
这样可以把二进制中的每一位都放在最低位上
现在只要用1&这个数,根据0或者1判断该位是否是1了
具体算法可以利用while循环,如下
int count_one_bits(int num)
{int count = 0;int i = 0;while (num)//拆到1/2=0结束{if(1&num)count++;//先统计完当前最后一位再拆num /=2;}return count;
}
int main()
{int num = 0;scanf("%d", &num);int ret = count_one_bits(num);printf("%d\n", ret);}
这里其实还可以使用移位符更直接的获得每一位
但我个人觉得利用权值的方法更加通用,能够体现进制的本质
总结一下
无论是什么进制,每一位的数字符号背后都有一个权值,给了数字意义
只要除以这个进制所对应的数,就可以实现降位,最终把每一位都放到最低位
除以2或10的原理,困扰了我很久,现在搞清楚分享出来,希望对其他新学c的小伙伴有所帮助
不过本人刚学c,对于怎么处理其它进制的最低位还不怎么了解,欢迎大佬指教
新人,代码纯手写,结论个人归纳总结。觉得有帮助或者觉得用心了,就请点点赞👍吧
球球了
更多推荐
利用权值获取各种进制数据的每一位
发布评论