[英]Converting UInt64 to a binary array
我编写的将UInt64转换为二进制数组的方法遇到问题。 对于某些数字,我得到了不正确的二进制表示形式。
结果
正确的999 = 1111100111
正确的18446744073709551615 = 1111111111111111111111111111111111111111111111111111111111111111111
不正确吗 18446744073709551614 = 0111111111111111111111111111111111111111111111111111111111111111111110
根据在线转换器的二进制值18446744073709551614应该为1111111111111111111111111111111111111111111111111111111111111110
public static int[] GetBinaryArray(UInt64 n)
{
if (n == 0)
{
return new int[2] { 0, 0 };
}
var val = (int)(Math.Log(n) / Math.Log(2));
if (val == 0)
val++;
var arr = new int[val + 1];
for (int i = val, j = 0; i >= 0 && j <= val; i--, j++)
{
if ((n & ((UInt64)1 << i)) != 0)
arr[j] = 1;
else
arr[j] = 0;
}
return arr;
}
仅供参考 :这不是一项家庭作业,我需要将整数转换为二进制数组以进行加密,因此需要一个位数组。 我在该站点上发现的许多解决方案都将整数转换为二进制数的字符串表示形式,这是无用的,因此我想到了其他各种方法的混搭。
解释为什么该方法适用于某些数字而不适用于其他数字将是有帮助的。 是的,我使用了Math.Log,它运行缓慢,但是以后可以修复性能。
编辑:是的,我确实需要在其中使用Math.Log的行,因为我的数组将不会总是64位长,例如,如果我的数字是4,那么在二进制中它是100,即数组长度3。这是一个要求我的应用程序就是这样做的。
它不是输入UInt64.MaxValue - 1
的返回数组UInt64.MaxValue - 1
错误,似乎UInt64.MaxValue
错误。
该数组长65个元素。 这在直观上是错误的,因为UInt64.MaxValue
必须适合64位。
首先,除了做一个自然的日志并除以以2为底的对数外,您可以做一个以2为底的对数。
其次,您还需要对返回的值进行Math.Ceiling
,因为您需要该值完全适合位数。 用强制转换为int
丢弃其余部分意味着在声明结果数组时需要任意执行val + 1
。 这仅在某些情况下正确-其中一种不正确的是... UInt64.MaxValue
。 在必要的位数上加1可得到65个元素的数组。
第三,最后,您不能左移64位,因此在for循环初始化中i = val - 1
。
尚未对此进行详尽的测试...
public static int[] GetBinaryArray(UInt64 n)
{
if (n == 0)
{
return new int[2] { 0, 0 };
}
var val = (int)Math.Ceiling(Math.Log(n,2));
if (val == 0)
val++;
var arr = new int[val];
for (int i = val-1, j = 0; i >= 0 && j <= val; i--, j++)
{
if ((n & ((UInt64)1 << i)) != 0)
arr[j] = 1;
else
arr[j] = 0;
}
return arr;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.