V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhangchioulin
V2EX  ›  问与答

再 c 中 十进制转换成二进制代码求大家解答,谢谢!

  •  
  •   zhangchioulin · 2015-05-28 23:53:22 +08:00 · 2170 次点击
    这是一个创建于 3263 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请大家先看下面的代码。
    问:
    对于int value = (number>>temp) & 1;这句代码 我想问按位与操作不是要对二进制数进行运算的吗?为什么能直接对整数num进行运算?难道系统自动转换了?自动转换了为什么不直接输出?
    我记得我们人工十进制转换成二进制都要进行计算得出,为什么电脑通过按位与运算,和右移运算就能求出?我很想知道代码中其中的原理
    请大家帮忙说下这个过程是什么。

    代码如下:

    include <stdio.h>

    void printBinary(int number);

    int main()

    {

    printBinary(-10);
    
    return 0;
    

    }

    void printBinary(int number)

    {

    // 记录现在挪到第几位
    
    // (sizeof(number)*8) - 1 == 31
    
    int temp = ( sizeof(number)<<3 ) - 1;
    
    while ( temp >= 0 )
    
    {
    
        // 先挪位,再&1,取出对应位的值
    
        int value = (number>>temp) & 1;
    
        printf("%d", value);
    
        // 
    
        temp--;
    
    
    
        // 每输出4位,就输出一个空格
    
        if ( (temp + 1) % 4 == 0 )
    
        {
    
            printf(" ");
    
        }
    
    }    printf("\n");
    

    }

    17 条回复    2015-05-30 00:40:03 +08:00
    Reficul
        1
    Reficul  
       2015-05-29 00:02:50 +08:00 via Android   ❤️ 1
    计算机只认识二进制,不认识十进制。计算机处理的都是二进制,int类型代表整形,但在计算机里还是二进制表示和计算的。printf中,%d则是告诉printf函数,把这个数据当作十进制整形输出,你也可以用别的格式输出,十六进制,八进制都可以。
    ilotuo
        2
    ilotuo  
       2015-05-29 01:07:44 +08:00 via Android   ❤️ 1
    c语言里
    10 0xa 1010b 编译后运行在内存中是一样的。
    你应该看点c语言进阶的书
    Andiry
        3
    Andiry  
       2015-05-29 01:36:56 +08:00
    十进制只是输出而已,内部是二进制存储的
    404neko
        4
    404neko  
       2015-05-29 01:52:59 +08:00
    zhangchioulin
        5
    zhangchioulin  
    OP
       2015-05-29 06:49:27 +08:00 via iPhone
    @Reficul 我想问一下那为什么仅仅通过右移运算符和按位与运算符就能转换成二进制 其中是为什么呢
    hx1997
        6
    hx1997  
       2015-05-29 06:55:59 +08:00 via Android
    @zhangchioulin 不是转换成二进制,内存里就是二进制存储的,和运算符也没什么关系。
    myywin
        7
    myywin  
       2015-05-29 07:11:18 +08:00 via iPhone
    目测楼主大一期末复习
    pimin
        8
    pimin  
       2015-05-29 07:58:03 +08:00 via iPhone
    这里不存在进制转换,就是你说的直接打印,&1是取每一位的值。
    1&1=1,1&0=0
    zhangchioulin
        9
    zhangchioulin  
    OP
       2015-05-29 08:11:23 +08:00
    @myywin 我不是我是在自学objc但是先学c语言基本语法和指针
    zhangchioulin
        10
    zhangchioulin  
    OP
       2015-05-29 08:12:04 +08:00
    @pimin 就这样 按位与就能求出二进制了吗?好神奇
    pimin
        11
    pimin  
       2015-05-29 08:30:35 +08:00 via iPhone
    @zhangchioulin
    你的疑问在int value = (number>>temp) & 1;
    其中temp是当前位置,就是说打印到第几个了
    为了简便我们拿8bit二进制-10来看下
    11110110
    打印过程,第一次temp=7,
    value=(11110110>>7&00000001)
    &结果只有1和0,value右移7位最后一位是1,所以value第一次运算结果是1,打印1。
    第二次temp=6,结果是1,打印1,
    逐个打印完二进制所有字符。
    zhangchioulin
        12
    zhangchioulin  
    OP
       2015-05-29 18:15:54 +08:00
    @pimin 不好意思,今天回复晚了,打印的过程我知道的,我想知道为什么这样打印过后,打印的数字就是二进制?
    pimin
        13
    pimin  
       2015-05-29 18:42:22 +08:00   ❤️ 1
    @zhangchioulin
    因为数据存储本身就是2进制
    zhangchioulin
        14
    zhangchioulin  
    OP
       2015-05-29 20:54:36 +08:00
    @pimin 对不起不要觉得我笨啊,我就是觉得有点那理解....,不过现在知道了,我说一下不知道对不对,你看看:
    内存在进行右移运算的时候本身就是按照二进制比较的,但是系统本身不带二进制比较的这个功能,所以跟1比较就是一个转换的过程.
    谢谢你,我现在弄清楚了!谢谢!
    pimin
        15
    pimin  
       2015-05-29 21:55:55 +08:00 via iPhone
    @zhangchioulin
    你还没搞清楚,建议去看书。c/c++指针搞明白你就明白了。
    不是笨,自学难免的。
    zhangchioulin
        16
    zhangchioulin  
    OP
       2015-05-30 00:37:57 +08:00
    @pimin 好的,谢谢指点
    zhangchioulin
        17
    zhangchioulin  
    OP
       2015-05-30 00:40:03 +08:00
    @pimin 另外还想请教下,我上面说的错在哪里了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2381 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:10 · PVG 19:10 · LAX 04:10 · JFK 07:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.