利用权值获取各种进制数据的每一位

目录

输出一个整数的每一位

理解十进制权值:

那么计算机中最常见的二进制是否也是如此呢?

理解了以上十进制中位数和权值的关系,这个问题就很简单了

总结一下


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,对于怎么处理其它进制的最低位还不怎么了解,欢迎大佬指教

新人,代码纯手写,结论个人归纳总结。觉得有帮助或者觉得用心了,就请点点赞👍吧

球球了

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值