我不希望有人解释以下代码如何工作(它检查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;
}
答案 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
答案 4 :(得分:0)
|
是一个按位或。
所以该行正在进行digits = digits | (1 << (int)((n % 10) - 1));