Что состоит в том, чтобы протестировать самый простой путь, является ли число питанием 2 в C++?

Другое событие 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));
}

85
задан jfs 21 September 2015 в 02:48
поделиться

6 ответов

(n & (n - 1)) == 0 является лучшим. Однако обратите внимание, что это неправильно возвратит true для n=0, поэтому если это будет возможно, Вы захотите проверить на него явно.

http://www.graphics.stanford.edu/~seander/bithacks.html имеет большое количество умных алгоритмов битового жонглирования, включая этого.

170
ответ дан jbranchaud 24 November 2019 в 08:08
поделиться

Другой способ пойти (возможно, не самый быстрый) состоит в том, чтобы определить, является ли ln (x) / ln (2) целым числом.

-1
ответ дан MikeJ 24 November 2019 в 08:08
поделиться

Это не самый быстрый или самый короткий путь, но я думаю, что это очень читаемо. Таким образом, я сделал бы что-то вроде этого:

bool is_power_of_2(int n)
  int bitCounter=0;
  while(n) {
    if ((n & 1) == 1) {
      ++bitCounter;
    }
    n >>= 1;
  }
  return (bitCounter == 1);
}

Это работает, так как двоичный файл основан на полномочиях два. Любое число только с одним набором битов должно быть питанием два.

1
ответ дан Jere.Jones 24 November 2019 в 08:08
поделиться
bool is_power_of_2(int i) {
    if ( i <= 0 ) {
        return 0;
    }
    return ! (i & (i-1));
}
7
ответ дан Rob Wells 24 November 2019 в 08:08
поделиться

Полномочия два в двоичном файле похожи на это:

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));
}

Для большего количества битового жонглирования см. здесь .

46
ответ дан chappjc 24 November 2019 в 08:08
поделиться

Питание два будет иметь всего один набор битов (для неподписанных чисел). Что-то как

bool powerOfTwo = !(x == 0) && !(x & (x - 1));

будет хорошо работать; меньше, чем питание два составляют всю 1 с в менее значимых битах, так должен И к 0 поразрядно.

, Поскольку я принимал неподписанные числа, == 0 тестов (что я первоначально забыл, извините) соответствует. Можно хотеть a> 0 тестов при использовании целых чисел со знаком.

79
ответ дан Adam Wright 24 November 2019 в 08:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: