2014-05-07 3 views
0

Я пытаюсь взять 11 MSB бит и получить их значение, как это:Возьмите несколько MSB, от ИНТА

value = lineIntData & 0xFFE00000 >> 21; 

lineIntData является числом 8 шестнадцатеричных цифр.

Я не понимаю, почему я получаю ошибку компиляции: "Cannot Implicitly convert Long to Int". Ошибка исчезнет, ​​если я либо возьму одну цифру из шестнадцатеричной маски (таким образом, сделав ее 7 цифр), либо изменив int с int на long.

Почему я даже получаю эту ошибку? Разве не одна шестнадцатеричная цифра занимает 4 бита, что означает, что 8 цифр - 32 бита, поэтому все они должны соответствовать одному Int32? Если я делаю это неправильно, то как я могу принять значение 11 msbs числа?

+0

Попробуйте 'unsigned int' вместо' int' – Dialecticus

+0

Jon Skeet - эксперт здесь (* the * expert для C#), поэтому его решение, скорее всего, более корректно, чем я мог когда-либо собрать. И я не был уверен в актерском составе, поэтому написал его в комментарии, а не в ответе. – Dialecticus

ответ

1

Проблема заключается в том, что тип 0xFFE00000 является uint (потому что это больше, чем 0x7fffffff), и нет &(int, uint) оператора, так что обе стороны продвигаются к long.

Исправление просто: смещаться и затем маска:

value = (lineIntData >> 21) & 0x7ff; 

Сейчас все остается int повсюду.

Кстати, я лично всегда использовать скобки при перемещении и маскировке. Это означает, что мне не нужно запоминать правила приоритета для этих операторов. Хотя я помню приоритет для некоторых операторов, это один случай, когда я бы скорее использовал скобки.

+0

чтение csharpindepth ... –

+0

@ Jon Skeet, как насчет того, как я взял MSB? не мог я просто сделать сдвиг без побитового и? потому что он просто меняет все, что мне нужно, на начало и ставит все 0s для меня? –

+0

@YonatanNir: Нет, если это 'int' - если установлен верхний бит исходного значения, сдвиг будет заполняться 1s вместо 0s. Если вы использовали 'uint' для начала, вам просто нужно сдвинуть. –

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