2015-04-04 2 views
5

У меня есть целочисленный массив битов (длина всегда 64), как:Преобразование 64 бит массив в Int64 или ULONG C#

1110000100000110111001000001110010011000110011111100001011100100

, и я хочу, чтобы написать это в одном Int64 (или ULONG?) Переменной. Как это сделать?

Я попытался создать BitArray, а затем получить int, но он бросает System.ArgumentException, на CopyTo линии:

private static Int64 GetIntFromBitArray(BitArray bitArray) { 
    var array = new Int64[1]; 
    bitArray.CopyTo(array, 0); 
    return array[0]; 
} 

ответ

4

Это происходит потому, что, как указано в documentation,

Указанный массив должен быть совместимым типом. Поддерживаются только массивы типа bool, int и byte.

Так что вы могли бы сделать что-то вроде этого: (не проверено)

private static long GetIntFromBitArray(BitArray bitArray) 
{ 
    var array = new byte[8]; 
    bitArray.CopyTo(array, 0); 
    return BitConverter.ToInt64(array, 0); 
} 

Глядя на реализацию BitArray.CopyTo, было бы быстрее, чтобы скопировать биты в int[] (а затем построить long из его две половинки), которые могли бы выглядеть следующим образом: (также не проверено)

private static long GetIntFromBitArray(BitArray bitArray) 
{ 
    var array = new int[2]; 
    bitArray.CopyTo(array, 0); 
    return (uint)array[0] + ((long)(uint)array[1] << 32); 
} 

слепков в uint должны предотвратить знаковые EXTENS ион.

+0

Отлично! Ты сделал мой день! Решаемые. –

Смежные вопросы