本人需要把一段JS码换成C#的遇到下面问题JS:
var right = -1733305664;
right = (right << 1) | (right >>> 27);结果得 828355987C#:
int right = -1733305664; 
right = (right << 1) | (right >> 27);结果得 -13怎么会得-13的?哪里出问题了??应该都是逻辑右移应该没错啊

解决方案 »

  1.   

    我是LZ:
    前面进行了一系列的位转换了,一步步对照完全没问题,但到这一步就不对了?
    C#里既然是逻辑右移怎么会出现个负的呢???
      

  2.   

    right >>> 27应该是这里出问题了,>>>无符号右移操作。你修改成>>就是一样的了
      

  3.   

    在C#中对于移位操作,是对该数在计算机中的“二进制存储形式的整体”来说的<< (左移)就是:整体左移,在右边空出来的位全部补零。
    >> (右移)就是:1.无符号数,整体右移,左边空出来的位全部补零。
                  2.有符号数,整体右移,左边空出来的位全部补该数的符号位。 得到的二进制形式的数即是结果。JavaScript语言中得移位运算:<< (左移)   >> (右移):如果是无符号数,就无所谓了,按整体移。若是有符号数,符号位不动,不参与移位。>>> (无符号数的右移):全部看作是无符号数,左边空出来的位补0。(返回一个无符号类型的数)
      

  4.   

    4L所言正是,不过C#无现成的方法得自己写~~特结贴./// <summary>
            /// 特殊的右移位操作,补0右移,如果是负数,需要进行特殊的转换处理(右移位)
            /// </summary>
            /// <param name="value"></param>
            /// <param name="pos"></param>
            /// <returns></returns>
            public static int MoveByte(int value, int pos)
            {
                if (value < 0)
                {
                    string s = Convert.ToString(value, 2);    // 转换为二进制
                    for (int i = 0; i < pos; i++)
                    {
                        s = "0" + s.Substring(0, 31);
                    }
                    return Convert.ToInt32(s, 2);            // 将二进制数字转换为数字
                }
                else
                {
                    return value >> pos;
                }
            }        /// <summary>
            /// 特殊的右移位操作,补0右移,如果是负数,需要进行特殊的转换处理(右移位)
            /// </summary>
            /// <param name="value"></param>
            /// <param name="pos"></param>
            /// <returns></returns>
            public static long MoveByteL(long value, int pos)
            {
                if (value < 0)
                {
                    string s = Convert.ToString(value, 2);    // 转换为二进制
                    for (int i = 0; i < pos; i++)
                    {
                        s = "0" + s.Substring(0, 31);
                    }
                    return Convert.ToInt32(s, 2);            // 将二进制数字转换为数字
                }
                else
                {
                    return value >> pos;
                }
            }