при выполнении практического вопроса я столкнулся с кодом:
private char[] a;
int newcap = ((a.length * 3) >> 1) + 1;
где newcap - новая емкость массива, использование ((a.length*3)+1)
тоже будет достаточным, но вместо этого они использовали побитовый оператор. ((a.length*3)+1)
? Я знаю использование побитового оператора. Код находится по адресу http://www.java2s.com/Tutorials/Java/Collection/ArrayList/Create_a_Char_Array_List_in_Java.htm
Это было бы не то же самое, смещение вправо 1 бит - это то же самое, что делать деление на два.
Например, 10 >> 1 = 5
.
В вашем примере умножьте длину на 3, затем разделите на два и, наконец, добавьте 1 к результату, поэтому "Using ((a.length*3)+1)"
не будет "достаточным".
Однако обратите внимание, что ((a.length*3)/2 +1)
сделает то же самое.
Обратите внимание, что вы также можете умножить на два с побитовым оператором, но с левым сдвигом вместо правого сдвига.
System.out.println(10 << 1);//print 20
10 / 2
, то есть оператор деления
<<n is often used instead of multiplication with (2 to the power of n)
>>n is often used instead of division by (2 to the power of n)
Это только оптимизация производительности для процессора, которая дает тот же результат.
>> 1
это то же самое, что и деление на 2, но как использование побитового оператора является оптимизатором производительности вместо использования деления на 2