Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

Указание размера с использованием сдвига <<

#java


В очередной раз увидел в исходниках внутреннего класса IteratorSpliterator для класса
java.util.Spliterators такой код:  

    static final int BATCH_UNIT = 1 << 10;  // batch array size increment
    static final int MAX_BATCH = 1 << 25;  // max batch array size;


Для чего существует практика указывать размер сдвигом?
    


Ответы

Ответ 1



Предположу, что эти константы будут играть роль битовых флагов в установке значений, поэтому инициализировать константы сдвигом более ясно (см. магическое число) и экономно (в плане писанины при больших значениях), чем использовать десятичную запись int flag1 = 1; // 0x1 - 1 int flag2 = 1 << 1; // 0x2 - 2 int flag3 = 1 << 2; // 0x4 - 4 ... int flag25 = 1 << 25; // 0x2000000 - 33554432 int flag26 = 1 << 26; // 0x4000000 - 67108864 int flags = flag1 | flag3; boolean isSetFlag1 = (flags & flag1) == flag1; // true boolean isSetFlag2 = (flags & flag2) == flag2; // false boolean isSetFlag3 = (flags & flag3) == flag3; // true В вашем примере, вместо 1 << 25 пришлось бы присвоить 33554432 или 0x2000000 Я далек от мира Java, но думаю, что компилятор оптимизирует подобное константное выражение 1 << 25 и при компиляции подставит уже вычисленное значение, так что за производительность можно не беспокоиться.

Ответ 2



Цель просто получить число 2 в 10й и 25й степени. Это и быстро, и наглядно. Зачем - сложно сказать, надо разбираться в исходниках, но я так понимаю это нужно для побитовых операций, для оптимизации.

Комментариев нет:

Отправить комментарий