2015-11-20 3 views
5

Поскольку я проходил через исходный код ConcurrentHashMap, я столкнулся с таким большим количеством бит-операторов сдвига. Некоторые применяются для создания констант, а некоторые - для переменных.Использование оператора бит-сдвига сдвига в ConcurrentHashMap

static final int MAXIMUM_CAPACITY = 1 << 30; 
static final int MAX_SEGMENTS = 1 << 16; // slightly conservative 
long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE; 

Я не могу понять, если константа как MAXIMUM_CAPACITY может быть объявлена ​​непосредственно то, что использование с помощью оператора побитового сдвига.

+3

Я думаю, что разработчикам было легче определять эти значения, думая в двоичном, а не в десятичном формате. Бинарным представлением '1 << 30' является' 10000000000000000000000000000000000', что в некотором смысле выглядит «более простым», чем десятичным «1073741824'. – Mena

ответ

3

Они не используют число в десятичной форме (основание 10). Вместо этого они говорят: «это число с 30 конечными 0 бит», подразумевая, что число используется для систем base 2.

Чрезмерный сдвиг облегчает информирование читателя о значении. В базе 10 он будет представлять 1073741824, что кажется случайным числом.


Это обычное явление в программировании. Например:

int secondsInDay = 60 * 60 * 24; 

Мы представляем в количество секунд в минуту, умноженной на количество минут в час, умноженной на количества часов в день.

Мы могли бы просто поставить 86400, но что, если бы мы хотели изменить количество минут в час (чтобы представить время на какой-либо другой планете)? Вам нужно будет вручную вычислить его, чтобы изменить значение.

С другой стороны, разбив его на единицы, как показано выше, мы можем просто изменить середину 60, чтобы изменить количество минут в день.

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