Объяснение строки кода в c++, связанной с битовыми сдвигами
Я не хочу, чтобы кто-то объяснял, как работает следующий код (он проверяет, является ли int пандигитальным), поскольку я должен делать это сам. Мне просто нужна помощь в понимании строки 8 конкретно. Я не знаю, что делает|.
private bool isPandigital(long n) {
int digits = 0;
int count = 0;
int tmp;
while (n > 0) {
tmp = digits;
digits = digits | 1 << (int)((n % 10) - 1);
if (tmp == digits) {
return false;
}
count++;
n /= 10;
}
return digits == (1 << count) - 1;
}
5 ответов:
Я знаю, что другие уже объяснили, что это побитовое или, но я хотел бы дать свою собственную интерпретацию.
digits = digits | X
скопирует все 1 бит из X в цифры.
digits = digits | 1 << Y
будет "установлен" один бит в цифрах - он установит y-й бит.Итак, каждый цикл задает бит в цифрах.
| является побитовым или. Но код проверяет, имеет ли int длины n все цифры 1..n. это отличается от проверки палиндрома. Эта строка устанавливает (i-1)' - й бит
Код использует целое числоdigits
в 1, если последняя цифраn
равнаi
. [Кстати, код неверен: еслиn
содержит нулевую цифру, эта строка вызовет "неопределенное поведение": сдвиг целого числа на отрицательную величину дает неопределенный результат.]digits
для представления набора цифр. Вы можете узнать больше о технике осуществив поиск разрядная наборы.
|
является побитовымOR
Побитовое или принимает два битовых шаблона равной длины и выполняет логическую операцию включения или для каждой пары соответствующих битов. Результат в каждой позиции равен 1, если первый бит равен 1, или второй бит равен 1, или оба бита равны 1; в противном случае результат равен 0.
Пример:
10010000 01010000 -------- 11010000