main () {int i=5; printf("%d\n",i>>2<<2)};

 我来答
ft_jat
2011-09-18
知道答主
回答量:9
采纳率:0%
帮助的人:17.9万
展开全部
<<和>>,位移运算。
理解这种算法需要转换从二进制上来理解。

int i = 5; //将5转换成二进制为0000 0101(这里用8位的来表示,实际CPU会使用int实际位数来运算)
i>>2; //右移二位,移后由0来补充空白,即0000 0101>>2 = 0000 0001
i>>2<<2; //再左移二位,移后仍由0来补充,即0000 0001<<2 = 0000 0100
"%d\n", i>>2<<2 //所得值用十进制来表示,即为4

其实可简单地将位移N位理解为乘(除)2的N次方。但是要考虑溢出的问题,如
printf("%d\n", 0X80000000 << 1); //超过32位,实际打印结果为0, 不同系统可能会不同结果。

换一种思路,i>>N<<N,可以理解将i的二进制最后N位都清0。
即5 = 0000 0101 ,那么 i>>2<<2, 其实是将最后两位清0,即变成 0000 0100。
可以用宏来表示 #define CLR_BIT(_n, _bit) ((_n) >> (_bit) << (_bit))
这种思路要比用 位与 & 来清0要用趣得多。
leafallen
2011-09-16 · TA获得超过1.1万个赞
知道小有建树答主
回答量:1169
采纳率:50%
帮助的人:1217万
展开全部
相当于i先除以2,然后乘以2
i/2=5/2=2
然后2*2=4
所以输出的是4
谢谢采纳
追问
你这样的算法是在别的情况下好像行不通啊,比如,int a=10,输出a>>4那又怎么算呢?
追答
这道题目的作用是(前提是你输入的是正整数)
如果数字i是4的倍数,那么输出i
否则,输出离它最近且比它小的4的倍数
谢谢采纳
刚才解释错了
相当于i先除以4,然后乘以4
i/4=5/4=1
然后1*4=4
所以输出的是4
抱歉哈
题目的意思就是
如果4n<=i<4(n+1)
那么输出4n
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tonvoo
2011-09-17
知道答主
回答量:77
采纳率:0%
帮助的人:43.4万
展开全部
标准算法是先化为二进制,再右移或者左移,最后还原。
不过有个算法,对于正数,右移n就是除以n,左移n是乘以n
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tuobie53
2011-09-16 · TA获得超过316个赞
知道答主
回答量:284
采纳率:0%
帮助的人:231万
展开全部
#include
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式