Пояснение к строке кода в c ++, связанной с битовыми сдвигами - PullRequest
2 голосов
/ 07 января 2012

Я не хочу, чтобы кто-то объяснил, как работает следующий код (он проверяет, является ли int pandigital), как я должен это делать сам.Мне просто нужна помощь, чтобы понять строку 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 ]

1 голос
/ 07 января 2012

Я знаю, что другие уже объяснили, что это побитовое ИЛИ, но я бы хотел дать свою собственную интерпретацию.

digits = digits | X скопирует все 1 бит из X в цифры.

digits = digits | 1 << Y установит один бит цифрами - установит бит Y.

Итак, каждый цикл устанавливает бит в цифрах.

1 голос
/ 07 января 2012

|побитовый или.Но код проверяет, имеет ли int длины n все цифры 1..n.Это отличается от проверки палиндрома.Эта строка устанавливает бит (i-1) digits в 1, если последняя цифра n равна i.[Кстати, код неправильный: если n содержит нулевую цифру, эта строка вызовет «неопределенное поведение»: сдвиг целого числа на отрицательную величину дает неопределенный результат.]

Код используетцелое число digits для представления набора цифр.Вы можете узнать больше о технике, выполнив поиск наборов битов.

0 голосов
/ 07 января 2012

| - побитовое или.

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

0 голосов
/ 07 января 2012

| поразрядно OR

Побитовое ИЛИ принимает две битовые комбинации одинаковой длины и выполняет логическую операцию ИЛИ с включением в каждой паре соответствующих битов. Результат в каждой позиции равен 1, если первый бит равен 1 ИЛИ второй бит равен 1 ИЛИ оба бита равны 1; в противном случае результат равен 0.

Пример:

10010000
01010000
--------
11010000

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

0 голосов
/ 07 января 2012

Похоже, что выполняется побитовое ИЛИ.

...