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

2015-05-28 23:53:22 +08:00
 zhangchioulin

请大家先看下面的代码。
问:
对于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");

}

2237 次点击
所在节点    问与答
17 条回复
Reficul
2015-05-29 00:02:50 +08:00
计算机只认识二进制,不认识十进制。计算机处理的都是二进制,int类型代表整形,但在计算机里还是二进制表示和计算的。printf中,%d则是告诉printf函数,把这个数据当作十进制整形输出,你也可以用别的格式输出,十六进制,八进制都可以。
ilotuo
2015-05-29 01:07:44 +08:00
c语言里
10 0xa 1010b 编译后运行在内存中是一样的。
你应该看点c语言进阶的书
Andiry
2015-05-29 01:36:56 +08:00
十进制只是输出而已,内部是二进制存储的
404neko
2015-05-29 01:52:59 +08:00
zhangchioulin
2015-05-29 06:49:27 +08:00
@Reficul 我想问一下那为什么仅仅通过右移运算符和按位与运算符就能转换成二进制 其中是为什么呢
hx1997
2015-05-29 06:55:59 +08:00
@zhangchioulin 不是转换成二进制,内存里就是二进制存储的,和运算符也没什么关系。
myywin
2015-05-29 07:11:18 +08:00
目测楼主大一期末复习
pimin
2015-05-29 07:58:03 +08:00
这里不存在进制转换,就是你说的直接打印,&1是取每一位的值。
1&1=1,1&0=0
zhangchioulin
2015-05-29 08:11:23 +08:00
@myywin 我不是我是在自学objc但是先学c语言基本语法和指针
zhangchioulin
2015-05-29 08:12:04 +08:00
@pimin 就这样 按位与就能求出二进制了吗?好神奇
pimin
2015-05-29 08:30:35 +08:00
@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
2015-05-29 18:15:54 +08:00
@pimin 不好意思,今天回复晚了,打印的过程我知道的,我想知道为什么这样打印过后,打印的数字就是二进制?
pimin
2015-05-29 18:42:22 +08:00
@zhangchioulin
因为数据存储本身就是2进制
zhangchioulin
2015-05-29 20:54:36 +08:00
@pimin 对不起不要觉得我笨啊,我就是觉得有点那理解....,不过现在知道了,我说一下不知道对不对,你看看:
内存在进行右移运算的时候本身就是按照二进制比较的,但是系统本身不带二进制比较的这个功能,所以跟1比较就是一个转换的过程.
谢谢你,我现在弄清楚了!谢谢!
pimin
2015-05-29 21:55:55 +08:00
@zhangchioulin
你还没搞清楚,建议去看书。c/c++指针搞明白你就明白了。
不是笨,自学难免的。
zhangchioulin
2015-05-30 00:37:57 +08:00
@pimin 好的,谢谢指点
zhangchioulin
2015-05-30 00:40:03 +08:00
@pimin 另外还想请教下,我上面说的错在哪里了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/194551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX