请大家先看下面的代码。
问:
对于int value = (number>>temp) & 1;这句代码 我想问按位与操作不是要对二进制数进行运算的吗?为什么能直接对整数num进行运算?难道系统自动转换了?自动转换了为什么不直接输出?
我记得我们人工十进制转换成二进制都要进行计算得出,为什么电脑通过按位与运算,和右移运算就能求出?我很想知道代码中其中的原理
请大家帮忙说下这个过程是什么。
代码如下:
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");
}
1
Reficul 2015-05-29 00:02:50 +08:00 via Android 1
计算机只认识二进制,不认识十进制。计算机处理的都是二进制,int类型代表整形,但在计算机里还是二进制表示和计算的。printf中,%d则是告诉printf函数,把这个数据当作十进制整形输出,你也可以用别的格式输出,十六进制,八进制都可以。
|
2
ilotuo 2015-05-29 01:07:44 +08:00 via Android 1
c语言里
10 0xa 1010b 编译后运行在内存中是一样的。 你应该看点c语言进阶的书 |
3
Andiry 2015-05-29 01:36:56 +08:00
十进制只是输出而已,内部是二进制存储的
|
5
zhangchioulin OP @Reficul 我想问一下那为什么仅仅通过右移运算符和按位与运算符就能转换成二进制 其中是为什么呢
|
6
hx1997 2015-05-29 06:55:59 +08:00 via Android
@zhangchioulin 不是转换成二进制,内存里就是二进制存储的,和运算符也没什么关系。
|
7
myywin 2015-05-29 07:11:18 +08:00 via iPhone
目测楼主大一期末复习
|
8
pimin 2015-05-29 07:58:03 +08:00 via iPhone
这里不存在进制转换,就是你说的直接打印,&1是取每一位的值。
1&1=1,1&0=0 |
9
zhangchioulin OP @myywin 我不是我是在自学objc但是先学c语言基本语法和指针
|
10
zhangchioulin OP @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, 逐个打印完二进制所有字符。 |
12
zhangchioulin OP @pimin 不好意思,今天回复晚了,打印的过程我知道的,我想知道为什么这样打印过后,打印的数字就是二进制?
|
13
pimin 2015-05-29 18:42:22 +08:00 1
@zhangchioulin
因为数据存储本身就是2进制 |
14
zhangchioulin OP @pimin 对不起不要觉得我笨啊,我就是觉得有点那理解....,不过现在知道了,我说一下不知道对不对,你看看:
内存在进行右移运算的时候本身就是按照二进制比较的,但是系统本身不带二进制比较的这个功能,所以跟1比较就是一个转换的过程. 谢谢你,我现在弄清楚了!谢谢! |
15
pimin 2015-05-29 21:55:55 +08:00 via iPhone
|
16
zhangchioulin OP @pimin 好的,谢谢指点
|
17
zhangchioulin OP @pimin 另外还想请教下,我上面说的错在哪里了?
|