2013-03-12 1 views
1

Для того, чтобы преобразовать из INT в IP Строка Я использую подход в Going from 127.0.0.1 to 2130706433, and back againFindBugs: INT_VACUOUS_BIT_OPERATION

private static final byte BYTE_MASK = (byte)0xff; 

protected byte[] unpack(int bytes) { 
    return new byte[] { 
     (byte)((bytes >>> 24) & BYTE_MASK), 
     (byte)((bytes >>> 16) & BYTE_MASK), 
     (byte)((bytes >>> 8) & BYTE_MASK), 
     (byte)((bytes  ) & BYTE_MASK) 
    }; 
} 

Но FindBugs в Eclipse порождает ошибки: INT_VACUOUS_BIT_OPERATION.

INT_VACUOUS_BIT_OPERATION: бит-операции, которые не выполняют никакой значимой работы.

Почему это и как его исправить?

ответ

4

Я подозреваю, что это потому, что вам не нужен & BYTE_MASK если вы также литье в byte. Я предполагаю, что BYTE_MASK равен 0xff ... и в этом случае это в основном бессмысленно. Такой же эффект будет иметь только кастинг.

От section 5.1.3 of the JLS:

сужающее преобразование из целого числа к интегральному типу T просто отбрасывает все, кроме п низших битов порядка, где п число битов используется для представления типа T. В дополнение к возможной потере информации о величине числового значения, это может привести к тому, что знак результирующего значения будет отличаться от знака входного значения.

+0

Я пропустил BYTE_MASK, добавленный для будущих читателей. Спасибо –

+0

Да, ошибка ушла. Я соглашусь через 7 минут. –