main () {int i=5; printf("%d\n",i>>2<<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<
>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<
>2<<2, 其实是将最后两位清0,即变成
0000
0100。
可以用宏来表示 #define
CLR_BIT(_n,
_bit)
((_n)
>>
(_bit)
<<
(_bit))
这种思路要比用
位与
&
来清0要用趣得多。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询