本人需要把一段JS码换成C#的遇到下面问题JS:
var right = -1733305664;
right = (right << 1) | (right >>> 27);结果得 828355987C#:
int right = -1733305664;
right = (right << 1) | (right >> 27);结果得 -13怎么会得-13的?哪里出问题了??应该都是逻辑右移应该没错啊
var right = -1733305664;
right = (right << 1) | (right >>> 27);结果得 828355987C#:
int right = -1733305664;
right = (right << 1) | (right >> 27);结果得 -13怎么会得-13的?哪里出问题了??应该都是逻辑右移应该没错啊
前面进行了一系列的位转换了,一步步对照完全没问题,但到这一步就不对了?
C#里既然是逻辑右移怎么会出现个负的呢???
>> (右移)就是:1.无符号数,整体右移,左边空出来的位全部补零。
2.有符号数,整体右移,左边空出来的位全部补该数的符号位。 得到的二进制形式的数即是结果。JavaScript语言中得移位运算:<< (左移) >> (右移):如果是无符号数,就无所谓了,按整体移。若是有符号数,符号位不动,不参与移位。>>> (无符号数的右移):全部看作是无符号数,左边空出来的位补0。(返回一个无符号类型的数)
/// 特殊的右移位操作,补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;
}
}