#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й степени. Это и быстро, и наглядно. Зачем - сложно сказать, надо разбираться в исходниках, но я так понимаю это нужно для побитовых операций, для оптимизации.
Комментариев нет:
Отправить комментарий