猿问

按位右移运算

#include<stdio.h>

void main()

char a='a',b='b';

int p,c,d;

p=a;

p=(p<<8)|b;

d=p&0xfff;

c=(p&0xfff00)>>8;

printf("a=%d\nb=%d\nc=%d\n=%d\nd=%d\n",a,b,c,d);

}

/*请问d=p&0xfff是什么意思,还有c=(p&0xfff00)>>8;这一步。求大神指点,希望解题步骤详细。*/





最美的年华
浏览 1390回答 2
2回答

太阳雨下

我刚验证了一下,最后一句与验证不一致,应该是我理解错了,注意下别被误导按照实验的结果,跟后面内存的数据还有关系,所以具体c是什么结果就不一定了

太阳雨下

1. 假设p=a(97),二进制表示就是0110 00012. p<<8,结果就是 0110 0001 0000 00003. 然后与b(0110 0010)或p: 0110 0001 0000 0000b: 0000 0000 0110 0010或之后结果:p: 0110 0001 0110 00104. d = p&oxfff就是0000 0110 0001 0110 00100000 0000 1111 1111 1111相与(只有都为1是才为1)所以之后就是:d: 0000 0000 0001 0110 00105. c=(p&0xfff00)>>8就是将p的后2个字节清零,然后右移8位p: 0110 0001 0110 0010与之后:p: 0110 0001 0000 0000右移8位p: 0000 0000 0110 0001这里有与的操作就相当于释放其不用的内存,如果没有与的操作,得到的c的结果是一样的(因为32位系统中整形占4个字节),不过内存有块就没释放,不与之后的场景(非加粗部分是c的值):0000 0000 0110 0001 0110 0010
随时随地看视频慕课网APP
我要回答