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

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

Http://en.wikipedia.org/wiki/Bitwise_operation

| является побитовым или.

Итак, линия делает digits = digits | (1 << (int)((n % 10) - 1));