c ++中与bitshifts相关的代码行的解释

时间:2012-01-07 06:29:31

标签: c++ bit-shift

我不希望有人解释以下代码如何工作(它检查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 个答案:

答案 0 :(得分:1)

|是按位还是。但代码检查长度为n的int是否包含所有数字1..n。这与回文检查不同。如果digits的最后一位是n,该行会将i的第(i-1)位置为1。 [BTW,代码错误:如果n包含零位数,该行将触发“未定义的行为”:将整数移动一个负数会产生一个未定义的结果。]

代码使用整数digits来表示一组数字。您可以通过搜索位集来了解有关该技术的更多信息。

答案 1 :(得分:1)

我知道其他人已经解释过这是一个按位OR,但我想给出我自己的解释。

digits = digits | X会将X中的所有1位复制到数字中。

digits = digits | 1 << Y将“设置”一位数字 - 它将设置第Y位。

因此,每个循环都会设置一个数字位。

答案 2 :(得分:0)

它似乎正在执行按位或。

答案 3 :(得分:0)

|是一个按位OR

按位OR采用相等长度的两个位模式,并对每对相应位执行逻辑包含OR运算。如果第一位为1或第二位为1或两位均为1,则每个位置的结果为1;否则,结果为0。

示例:

10010000
01010000
--------
11010000

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

答案 4 :(得分:0)

|是一个按位或。

所以该行正在进行digits = digits | (1 << (int)((n % 10) - 1));