Объяснение строки кода в 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