main () {int i=5; printf("%d\n",i>>2<<2)};
展开全部
<<和>>,位移运算。
理解这种算法需要转换从二进制上来理解。
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要用趣得多。
理解这种算法需要转换从二进制上来理解。
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要用趣得多。
展开全部
相当于i先除以2,然后乘以2
i/2=5/2=2
然后2*2=4
所以输出的是4
谢谢采纳
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
标准算法是先化为二进制,再右移或者左移,最后还原。
不过有个算法,对于正数,右移n就是除以n,左移n是乘以n
不过有个算法,对于正数,右移n就是除以n,左移n是乘以n
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询