为了账号安全,请及时绑定邮箱和手机立即绑定

按位右移运算

按位右移运算

C++
最美的年华 2015-12-25 23:53:05
#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;这一步。求大神指点,希望解题步骤详细。*/
查看完整描述

2 回答

已采纳
?
太阳雨下

TA贡献7条经验 获得超1个赞

我刚验证了一下,最后一句与验证不一致,应该是我理解错了,注意下别被误导

按照实验的结果,跟后面内存的数据还有关系,所以具体c是什么结果就不一定了

查看完整回答
反对 回复 2015-12-26
?
太阳雨下

TA贡献7条经验 获得超1个赞

1. 假设p=a(97),二进制表示就是0110 0001

2. p<<8,结果就是 0110 0001 0000 0000

3. 然后与b(0110 0010)或

p: 0110 0001 0000 0000

b: 0000 0000 0110 0010

或之后结果:

p: 0110 0001 0110 0010

4. d = p&oxfff就是

0000 0110 0001 0110 0010

0000 0000 1111 1111 1111

相与(只有都为1是才为1)所以之后就是:

d: 0000 0000 0001 0110 0010

5. 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

查看完整回答
反对 回复 2015-12-26
  • 2 回答
  • 0 关注
  • 1385 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信