[英]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.