高效率的10进制转2进制(C版)

先看例子《扫地机器人》:

 题目中涉及到了二进制中对某一位的三个操作,分别是:清零,置一,取反

①清零

如何让二进制中的某一位的值变为0而其他位保持不变呢?

这要涉及到了 按位与运算(都为1才为1) ,只要让这个二进制中的某一位的值对应的位数做和0的按位与运算,而其他的做1的按位与运算即可,以上题为例子:

 

 ②置一

如何让二进制中的某一位的值变为1而其他位保持不变呢?

这要涉及到了 按位或运算(有1即为1) ,只要让这个二进制中的某一位的值对应的位数做和1的按位或运算,而其他的做0的按位或运算即可,以上题为例子:

 

  ②取反

如何让二进制中的某一位的值取反而其他位保持不变呢?

这要涉及到了 按位异或运算(相同为0,不同为1) ,只要让这个二进制中的某一位的值对应的位数做和1的按位异或运算,而其他的做0的按位异或运算即可,(0 ^ 1 = 1 ,1 ^ 1 = 0 ,0 ^ 0 = 0 ,1 ^ 0 = 1 ,所以和1异或是取反,和0异或是不变)以上题为例子:

 

 然后就是如何以二进制的形式输出了

我们在C语言中想要以10进制、8进制和16进制输出很简单只需要在输出时用%d、%o,%x即可。

但是想要二进制输出就需要编写一个步骤了,快点抛弃你的取余符号,想想如何用位运算进行呢?

x & 01 相当于只保留了最低位,因为只有最低位是按位与运算保留,其他位都是清零。
而 ( x >> 1 ) & 01 相当于只保留了比最低位高一级的次级位数,以此类推,( x >> n ) & 01 相当于只保留了比最低位高n位的次级位数。
然后通过循环从最高位到最低位依次输出即可

 实现代码如下:

#include<stdio.h>
#include<math.h>

int main()
{
	int x;
	x = 111; // 二进制为 01101111
	/*分别输出十进制,八进制,十六进制的值*/
	printf("%d %o %x\n", x, x, x);
	/*
		十进制的数字以二进制的形式输出到控制台中
		x & 01 相当于只保留了最低位
		而 ( x >> 1 ) & 01 相当于只保留了比最低位高一级的次级位数
		然后从最高位到最低位依次输出即可
	*/
	int temp = 0,n;
	while (x >= pow(2,temp)) // 得到十进制数转换为2进制需要循环几次
	{
		temp++;
	}
	printf("%d\n",temp);
	for (int i = temp; i >= 0; i--)
	{
		n = (x >> i) & 1; //从高位依次取出
		printf("%d",n);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狗铂西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值