delhi位移与.NET位移区别
最近一个项目需要将一个DELPHI加密算法转移到C#中,发现右移与字符,C#和DELHI表示的结果不一样,经查看资料,
特说明如下:
一:正数与负数表示。
负数在计算机中用补码的形式,即正数的二进制取反加1就表示它的负数。例如: 32位的1,二进制表示为:00000000000000000000000000000001(Ox0001),
-1就表示为 11111111111111111111111111111111(OxFFFFFFFF)
二:右移
在C#中,右移 如果是正数的话,向右边移动,左边留下的空白位由0来填充,如果是负数的话,左边空白位由1来填充。
在DELPHI中,右移的话,不管是正数还是负数,左边留下的空白位都是由0来填充。
例如:
在DELPHI中,
i: integer;
i :=-1;
i shr 1 得到的结果是 Ox7FFFFFFE
在C#中
int i=-1;
i >> 1 得到的结果是OxFFFFFFFF
三:左移
左移运算,C#和DELPHI,正数和负数,都是向左移动,右边留下来的空白位由0来填充。
四:Char
在C#和DELPHI中都是字节符类型。
不过DELPHI的字符就占一个字节,8位。
而C#的字符类型可以表示Uncode码,可以占用2个字节。
五:delhi的SHR操作符转化成C#的函数
internal static int DelphiShr(int value, int offset)
{
BitArray array = new BitArray(new int[] { value });
offset %= array.Count;
for (int i = 0; i < array.Count; i++)
{
array[i] = i < array.Count - offset ? array[i + offset] : false;
}
int[] result = new int[1];
array.CopyTo(result, 0);
return result[0];
}