Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
(n & (n - 1)) == 0
является лучшим. Однако обратите внимание, что это неправильно возвратит true для n=0, поэтому если это будет возможно, Вы захотите проверить на него явно.
http://www.graphics.stanford.edu/~seander/bithacks.html имеет большое количество умных алгоритмов битового жонглирования, включая этого.
Другой способ пойти (возможно, не самый быстрый) состоит в том, чтобы определить, является ли ln (x) / ln (2) целым числом.
Это не самый быстрый или самый короткий путь, но я думаю, что это очень читаемо. Таким образом, я сделал бы что-то вроде этого:
bool is_power_of_2(int n)
int bitCounter=0;
while(n) {
if ((n & 1) == 1) {
++bitCounter;
}
n >>= 1;
}
return (bitCounter == 1);
}
Это работает, так как двоичный файл основан на полномочиях два. Любое число только с одним набором битов должно быть питанием два.
bool is_power_of_2(int i) {
if ( i <= 0 ) {
return 0;
}
return ! (i & (i-1));
}
Полномочия два в двоичном файле похожи на это:
1: 0001
2: 0010
4: 0100
8: 1000
Примечание, что существует всегда точно 1 набор битов. Единственное исключение с целым числом со знаком. например, 8-разрядное целое число со знаком со значением-128 похоже:
10000000
Поэтому после проверки, что число больше, чем нуль, мы можем использовать умное, немного взламывают для тестирования того, и только один бит установлен.
bool is_power_of_2(int x) {
return x > 0 && !(x & (x−1));
}
Для большего количества битового жонглирования см. здесь .
Питание два будет иметь всего один набор битов (для неподписанных чисел). Что-то как
bool powerOfTwo = !(x == 0) && !(x & (x - 1));
будет хорошо работать; меньше, чем питание два составляют всю 1 с в менее значимых битах, так должен И к 0 поразрядно.
, Поскольку я принимал неподписанные числа, == 0 тестов (что я первоначально забыл, извините) соответствует. Можно хотеть a> 0 тестов при использовании целых чисел со знаком.