日期:2014-05-17  浏览次数:20707 次

俗话说小鬼难缠啊!简单的C# 移位的问题
     
   uint x = 0xffffffff >> 31;          //头一次右移了31位,结果是1; 这个在我预料中
    x = x >> 1;  //再右一次,结果是0;这个也在预数;

        //但下面这个结果就泥玛大大出乎我的意料。右移了32位结果还是0xffff,ffff
        //我本来想他的结果也应该是0啊。每右移1次,剔除一个1,右移32位。
        //32个1全部剔除,那不应该是0吗???   
          //应该和让面的 x的结果是一样啊 可是y=0xffff,ffff
请问这是怎么回事???

        uint y = 0xffffffff >> 32; 

------解决方案--------------------
本帖最后由 caozhy 于 2013-10-27 00:26:26 编辑
MSDN上说了:
If the first operand is an int or uint (32-bit quantity), the shift count is given by the low-order five bits of the second operand. That is, the actual shift count is 0 to 31 bits.
也就是只取最低5位。
32 是二进制 100000,所以 n >> 32 相当于 n >> 0。
------解决方案--------------------
惭愧,应用型程序写多了。楼主的代码居然看不大懂了。

连个位数枚举都用int类型的菜鸟撸过,
------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/xt18et0d(v=vs.90).aspx

第二个操作数的低5位,不过是0~31