C语言算法之将十进制数转换成二进制数[通俗易懂]

C语言算法之将十进制数转换成二进制数[通俗易懂]导语:在C语言中没有将其他进制的数直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出为十六进制可以用%x,输出为二进制就要我们自行解决了。下面给大家讲述一下如何编程实现将十进制数转换成二进制数。先将源代码展示给大家:#include<stdio.h>voidmain(){//进制转换函数的声明inttransfer(intx)…

大家好,又见面了,我是你们的朋友全栈君。

导语:在C语言中没有将其他进制的数直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出为十六进制可以用%x,输出为二进制就要我们自行解决了。下面给大家讲述一下如何编程实现将十进制数转换成二进制数。

原文的实现方式太年轻了,是我大一的时候写的。由于太多小伙伴被『溢出』困扰(在溢出的情况下原文的实现就不灵了),补充下面这种最佳的实现方式。

最佳的方式是利用栈先进后出的特性,计算每一位(0或1)压入栈中,再将所有元素出栈得到的01串就是目标二进制数。以下为C++实现代码,想用C语言实现的可以进行相应的改造,用数组实现一个栈,用字符数组实现字符串。

#include <iostream>
#include <stack>

using namespace std;

string transfer(int x) {
    if (x == 0) {
        return "0";
    }
    string ret;
    stack<char> st;
    while (x > 0) {
        if (x % 2 == 1) {
            st.push('1');
        } else {
            st.push('0');
        }
        x /= 2;
    }
    while (!st.empty()) {
        ret.push_back(st.top());
        st.pop();
    }
    return ret;
}

int main() {
    int x;
    cin >> x;
    cout << transfer(x) << endl;
    return 0;
}

下面是大一时候的实现,没有考虑溢出的问题,对于不懂栈的同学可以看一下。

先将源代码展示给大家:

#include <stdio.h>
void main()
{
    //进制转换函数的声明
    int transfer(int x);
    int x;
    printf("请输入一个十进制数:");
    scanf("%d",&x);
    printf("转换成二进制数是:%d\n",transfer(x));
}
int transfer(int x)
{
    int p=1,y=0,yushu;
    while(1)
    {
        yushu=x%2;
        x/=2;
        y+=yushu*p;
        p*=10;
        if(x<2)
        {
            y+=x*p;
            break;
        }
    }
    return y;
}

具体算法体现在函数体内,使用了一个while(1)的死循环,当结果产生后跳出循环。变量yushu是每一次循环内产生的余数,变量x每次循环都会被赋予新的值,这个新的值就是每一次循环内产生的商。当产生的商小于2时即产生了最后的结果(二进制数),然后跳出循环。

例如:函数自变量若为7,用自变量7除以2,得到第一次循环产生的余数为1,第一次循环产生的商为3;用第一次循环产生的商3除以2,得到第二次循环产生的余数为1,第二次循环产生的商为1。

变量y的存放也是有一定技巧的,由于每次产生的余数都小于2并且都是最后二进制数中需要按位展现出来的,因此每一次循环产生的余数都要合理地进行存放。第一次产生的余数放在个位,第二次产生的余数放在十位,第三次产生的余数放在百位……依次类推,直至某一次循环产生的商小于2,最后再把小于2的那个商放在最高位。变量p的作用就是控制位数,变量y的初始值定为0,变量p的初始值定为1,每次循环内变量p都自乘10,每次循环内都让变量y加上yushu*p,这样就实现了余数的按位存放。最后将小于2的那个商乘以p加到变量y中,得到最后的二进制数。

例如:还是以自变量7为例,第一次循环后y的值为1,第二次循环内if语句之前y的值为11,if语句内y的值变为111,111即为7的二进制数。

注意:变量p的自乘要放在变量y加上yushu*p之后!顺序不能颠倒!

欢迎大家关注/订阅我的微信公众号Code Art Online,我会在我的公众号分享个人见闻,发现生活趣味;这里不仅有0和1,还有是诗和远方↓↓↓

C语言算法之将十进制数转换成二进制数[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144527.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • windows loader v2.2_Windows Modules Installer

    windows loader v2.2_Windows Modules Installer这是WindowsLoader最新版本,解决了Win7+Win8双系统情况下,Win7“软改”激活的失效异常。目前网上“软改”工具尽管不少但制作精良者不多。特别是制作技术精湛、支持版本众多的更是凤毛麟角。我对激活工具历来要求比较苛刻。今天向大家推荐的这款“软改”工具,支持包括Win7在内的MicrosoftWindows多版本永久激活。值得各位网友收藏使用。可对以下32位/64位…

    2022年10月12日
    4
  • 普通交换机可以poe供电吗_poe供电交换机和普通交换机区别

    普通交换机可以poe供电吗_poe供电交换机和普通交换机区别交换机相信大家都比较熟悉,一般说的交换机指的普通交换机,也就是最常见的那种。普通交换机可以传输交换数据,或者局域网内的多个电脑可以相互通信。PoE交换机指可以供电的交换机,跟普通交换机的区别是,它不仅而已传输交换数据,还可以同时给与它连接的设备供电,这样的目的是可以免去额外的电源布线,不用刻意请电工师傅。可能有朋友会问,普通交换机能否改成PoE供电的,如何将普通交换机变成PoE交换机?接下来我们就跟随飞畅科技的小编一起来详细看看吧!普通交换机和poe交换机虽都是交换机,在内部结构有区别的,PoE交换机里

    2022年10月4日
    3
  • Visual Studio 15.8 Preview 3支持多点编辑功能

    Visual Studio 15.8 Preview 3支持多点编辑功能

    2021年6月8日
    110
  • ORM初识和数据库操作

    ORM简介ORM概念及特点为什么用ORMORM的作用ORM的优劣势ORM的优势ORM的劣势ORM总结映射关系ORM的俩大功能ORM链接数据库创建表之前的准备工作1、自己创建数据

    2022年3月29日
    44
  • 防止Lambda的各种坑爹(二)

    防止Lambda的各种坑爹(二)

    2021年8月20日
    56
  • MySQL: Hash索引优缺点

    MySQL: Hash索引优缺点优点:因为索引自身只需存储对应的哈希值,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快缺点:1、不能避免读取行哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能的影响并不明显。2、无法用于排序哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。3、无法使用部分索…

    2022年5月26日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号