黑马程序员—C学习笔记—左移和右移实现二进制转换(以及BUG解决心得)

2023-05-16

———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————

自己敲得一些代码,来更好地了解左移右移运算,并且将10进制整数转换为2进制输入。代码如下,关于里面的变化,相信小伙伴们能够从注释里面看到。
#include <stdio.h>


int main()
{
    void IntToBinary();
    void IntToBinary2();

    int inputNumber = 0;

//    do
//    {
//        printf("请您输入需要转换为二进制的数,退出请输入0:\n");
//        scanf("%d",&inputNumber);
//        IntToBinary(inputNumber);
//        IntToBinary2(inputNumber);
//    }while (inputNumber!=0);

    //上述写法,退出时,依然转换0

//    printf("请您输入需要转换为二进制的数,退出请输入0:\n");
//    scanf("%d",&inputNumber);
//    
//    while(inputNumber!=0)
//    {
//        IntToBinary(inputNumber);
//        IntToBinary2(inputNumber);
//    }
    //上述写法,死循环

        do
        {
            printf("请您输入需要转换为二进制的数,退出请输入0:\n");
            scanf("%d",&inputNumber);
            if(inputNumber==0){break;}  //这一行必不可少,否则只能用goto语句了
            IntToBinary(inputNumber);
            IntToBinary2(inputNumber);
            printf("\n");
        }while (inputNumber!=0);


    return 0;
}

//下面是两种IntToBinary();函数去实现10进制数目转换为2进制输入的情况。

//利用右移动

void IntToBinary(int num)  //此方法的思路是不断向右移动目标数来获得目标数在某一位上面的0或者1。
{
    //不同编译器,int长度可能有所不同,首先是获得int长度
    int intLength = sizeof(int);//字节数,转换为位数,还需要乘以8
    printf("你输入的十进制数字%d转换为二进制如下:\n",num);

    for(int i = (intLength<<3)-1;i >= 0;i--)//确定i的范围边界时,需要特别注意开始和收尾的数据,i最小可以为0,而不是1。
    {
        printf("%d",(num>>i)&1);
        if(i%4==0)
        {
            printf(" ");
        }
    }

    printf("\n");

}

void IntToBinary2(int num)  //此方法是不移动目标数,而是移动临时数据,也可以获取目标数某一位上得值。
{
    //不同编译器,int长度可能有所不同,首先是获得int长度
    int intLength = sizeof(int);//字节数,转换为位数,还需要乘以8
    printf("你输入的十进制数字%d转换为二进制第二种方法如下:\n",num);

//    for(int i = (intLength<<3)-1;i >= 0;i--)
//    {
//        printf("%d",(num&(1<<i))>0?1:0);
//        if(i%4==0)
//        {
//            printf(" ");
//        };
//    };

    printf("%d",(num>0?0:1));//判断数字正负性,提前打出第一个字符,确保后续左移操作不越出边界

    for(int i = (intLength<<3)-2;i >= 0;i--)
    {
        printf("%d",(num&(1<<i))>0?1:0);
        if(i%4==0)
        {
            printf(" ");
        };
    };


    printf("\n1<<30=%d",1<<30);
    printf("\n1<<31=%d",1<<31);
    printf("\n1>>1=%d",1>>1);
    printf("\n1>>2=%d",1>>2);

    printf("\n");

}

程序运行结果如下:
这里写图片描述

综合以上代码和注释可以看出,左移右移运算是有边界的,一旦逾越可能会得到未知的结果,所以sizeof是很有必要使用来动态获取当前环境变量所占字符数,然后,右移操作注意移到最后一位,左移还得多考虑一个符号位的问题,建议测试的时候使用负数测试一下,不然可能忽略到这个小问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑马程序员—C学习笔记—左移和右移实现二进制转换(以及BUG解决心得) 的相关文章

  • 最简单最节省成本的锂电池充电电路!拆开火火兔,搬起小板凳,听老梁分析...

    作者 xff1a LR梁锐 xff0c 整理 xff1a 晓宇 微信公众号 xff1a 芯片之家 xff08 ID xff1a chiphome dy xff09 用了一年的火火兔坏了 xff0c 充不了电 作为一名合格的电工 xff0c
  • 题解 教主的魔法(分块学习记录)

    64 luogu 看到询问个数少 xff0c 分块的复杂度能过 xff0c 于是人生第一次打了分块 xff0c 居然A了 据说也有线段树瞎搞的 xff0c 不过我不会写 总之 xff0c 边角暴力 xff0c 块内二分 xff0c 受影响的
  • Ubuntu虚拟机找不到共享文件夹的解决办法

    Ubuntu虚拟机找不到共享文件夹的解决办法 一 查看共享文件夹是否设置成功 vmware hgfsclient 二 挂载共享文件夹到 mnt目录下 sudo vmhgfs fuse host mnt o nonempty o allow
  • 秒懂函数回调机制,回调函数看这篇就够了

    什么是回调函数 友情提示 xff1a 原理介绍部分摘自 xff1a https www jianshu com p 2f695d6fd64f 有一定基础的直接跳过即可 xff0c 直接查看后面精彩部分 回调函数就是一个通过函数指针调用的函数
  • vbox下安装archlinux

    博主linux小白一个 xff0c 一直想试试archlinux xff0c 最近终于有时间了 xff0c 一番努力之后成功了 xff0c 写出来与大家分享 archlinux版本 2013 06 01 archlinux的优点就不说了 x
  • IDL环境下,HDF文件转TIFF格式

    在IDL环境下 xff0c 将HDF文件转TIFF格式 在遥感图像处理过程中 xff0c 我们经常遇到HDF文件 xff0c 如modis影像数据 那么HDF数据到底是怎样的呢 xff1f 百科的解释 xff1a HDF是用于存储和分发科学
  • ModuleNotFoundError:No Module named‘lpips‘问题怎么解决?

    今天在复现论文的时候 xff0c 发现配置环境中缺少一个 34 lpips 34 的包 这里记录一下 xff0c 给有需要的小伙伴 废话不多说 xff0c 直接上干货 xff1a 1 打开 https pypi org xff0c 输入缺少
  • bat文件批处理vcbuild、msbuild或者devenv

    最近用bat文件调用vcbuild或者msbuild xff0c 对于只调用简单的命令行 xff0c 可以很快上手 xff0c 可以查询msdn的关于msbuild的使用指导http msdn microsoft com zh cn lib
  • Delphi源程序格式书写规范

    1 规范简介 本规范主要规定Delphi源程序在书写过程中所应遵循的规则及注意事项 编写该规范的目的是使公司软件开发人员的源代码书写习惯保持一致 这样做可以使每一个组员都可以理解其它组员的代码 xff0c 以便于源代码的二次开发记忆系统的维
  • NoMachine出现 The session negotiation failed的解决方案及踩坑总结

    问题情况 xff1a 我A电脑输入用户名和密码可以远程B电脑 xff0c B电脑输入用户名密码就是登录不上A电脑 B电脑上密码是用的账户密码 xff08 就是图标是一把钥匙的那个 xff09 A电脑上的密码是用的PIN密码 xff08 Wi
  • 利用Python+阿里云实现DDNS(动态域名解析)

    利用Python 43 阿里云实现DDNS 动态域名解析 因需求公司路由器公网ip不是动态的 xff0c 需要及时的修改阿里云的域名解析 前期准备 二 准备 1 公网IP xff08 向运营商申请的动态IP xff09 2 域名 xff08
  • 已知入栈顺序,总结出栈顺序的规律

    规律 xff1a 出栈的每一个元素的后面 xff0c 其中比该元素先入栈的一定按照入栈逆顺序排列 举例说明 xff1a 已知入栈顺序 xff1a 1 2 3 4 5 判断出栈顺序 xff1a 4 3 5 1 2 结果 xff1a 不合理 x
  • Linux系统使用cpulimit对CPU使用率进行限制

    介绍 cpulimit 是一个限制进程的 CPU 使用率的工具 xff08 以百分比表示 xff0c 而不是以 CPU 时间表示 xff09 当不希望批处理作业占用太多 CPU 时 xff0c 控制批处理作业很有用 目标是防止进程运行超过指
  • 题解·连续攻击游戏

    64 luogu 看上去这是一道二分图题 xff0c 将点i和它的两个属性值分别作为两个点集 xff0c 分别连边后跑匈牙利树 xff0c 若找不到匹配则输出解 span class token macro property span cl
  • Linux系统内网穿透教程

    Linux系统内网穿透可以通过使用SSH反向隧道 NAT端口映射 VPN等多种方式实现 xff0c 下面分别介绍这三种方式的实现方法 1 SSH反向隧道 SSH是一种加密的远程登录协议 xff0c 可以通过SSH反向隧道来实现内网穿透 首先
  • cpufreq 之powersave和performance governer的实现

    我们再来看看powersave的实现 xff0c 如下所示event是CPUFREQ GOV START时 xff0c 即开始这个governer时直接调用 cpufreq driver target来设定最低频率 19 static in
  • SQL 入门,看这篇就够了 ---- 基础篇

    目录 目录 目录 数据库安装 数据库基本概念 数据库管理系统 xff08 DBMS xff09 的分类 SQL 语句 创建 删除 更新操作 创建数据库 xff08 CREAT DATABASE xff09 创建表 删除表 更新表 查询 筛选
  • vi编辑器 编辑模式及命令模式常用命令

    在网上虽然有许多类似的文章 xff0c 但写的很杂 xff0c 不如这本书上看着顺畅 本文是 PHP 43 MySQL开发实战 220页到222页的内容 vi编辑器 文本编辑器是所有计算机系统中最常用的一种工具 UNIX下的编辑器有ex s
  • bash:yum:command not found 解决办法【转】

    今天需要用rhel7测试opencv 想安装opencv的时候 xff0c 突然yum不能用了 提示 xff1a bash xff1a yum command not found 在网上找到了以下方法 xff0c 亲测有效 xff08 根据
  • 解密微信数据库文件解析

    图解说明 xff1a 微信大量数据存储在本地比如 xff1a 联系人 xff08 包含好友地区 电话 通过那种方式添加 xff09 聊天内容 xff08 图片 文字 语音 视频 位置 名片 其他app分享链接 xff09 聊天室 收藏信息

随机推荐