2013-03-04 4 views
-1

Я пытаюсь понять, почему BigInteger бросает исключение переполнения. Я попытался визуализировать это, преобразовывая BigInteger в byte[] и итеративно увеличивая сдвиг, пока не увижу, где происходит исключение.Должен ли я иметь возможность смещать бит >> массив байтов?

  • Должен ли я иметь возможность битового сдвига >> байт [] или C# просто не в состоянии?

код вызывает исключение

 uint amountToShift2 = 12; 
     BigInteger num = new BigInteger(-126); 
     uint compactBitsRepresentation = (uint)(num >> (int)amountToShift2); 
+0

Вы не можете поменять бит байта [], но вы не получите исключение; он просто не будет компилироваться. Что вы делаете, это смещение бита BigInteger –

+0

, где объявлены 'num' и' amountToShift2'? можете ли вы опубликовать [SSCCE] (sscce.org), чтобы мы могли скопировать и вставить ваш код? –

+0

@SamIAm - SSCE обновлено.Это все, что вам нужно, кроме ссылки на System.Numerics – LamonteCristo

ответ

1

Что касается отредактированный вопроса с:

uint amountToShift2 = 12; 
BigInteger num = new BigInteger(-126); 
uint compactBitsRepresentation = (uint)(num >> (int)amountToShift2); 

Бит сдвига хорошо работает и производит BigInteger значения -1 (отрицательный).

Но конверсия в uint исключает из списка исключений becau -1 за пределами диапазона uint. Преобразование из BigInteger в uint не «обертывается» по модулю 2**32, а просто бросает.

Вы можете обойти это с:

uint compactBitsRepresentation = (uint)(int)(num >> (int)amountToShift2); 

, которые не бросят в unchecked контексте (что является обычным контекстом).

0

Там нет >> или << битового сдвига операторы для байтовых массивов в C#. Для этого вам нужно написать код вручную (обратите внимание на биты, которые отваливаются).

+0

этот код не имеет ничего общего с байтом [] –

+0

@PeterRitchie Знаете ли вы, что когда эти ответы были написаны, вопрос был совсем другим? –

+0

@JeppeStigNielsen Нет, я не знал; но я не уверен, как это имеет значение. Если ответ не отражает вопрос, ответ также должен быть отредактирован или удален. Зачем делать этот вопрос более запутанным? –

0

Что-то говорит мне, что оператор >> не будет работать со ссылочными типами, например массивами, а работает с примитивными типами.

ваши int s фактически представлены серии байтов, так сказать

int i = 6;

i представлен как

00000000000000000000000000000110 

>> сдвигает все биты вправо, изменяя его до

00000000000000000000000000000011 

или 3


Если вам действительно нужно сдвинуть массив байтов, он не должен быть слишком ужасно трудно определить свой собственный метод, чтобы переместить все элементы массива более 1 слот. Он будет иметь O (n) временная сложность.

+0

оператор >> применяется к BigInteger. например http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.op_rightshift.aspx –

+0

Обратите внимание, что его отредактированный вопрос теперь показывает успешное смещение бит «BigInteger», за которым следует безуспешное преобразование (преобразование) от 'BigInteger' до' uint'. См. Мой ответ. –