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;
}
I don't want someone to explain how the following code works (it checks whether an int is pandigital) as I should be doing that myself. I just need help understanding line 8 specifically. I don't know what the | is doing.
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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我知道其他人已经解释过这是一个按位或,但我想给出我自己的解释。
数字 = 数字 | X
会将 X 中的所有 1 位复制为数字。数字 = 数字 | 1<<; Y
将“设置”一个数字位 - 它将设置第 Y 位。因此,每个循环都会设置一位数字。
I know others have already explained that it's a bitwise OR, but I'd like to give my own interpretation.
digits = digits | X
will copy all the 1 bits from X into digits.digits = digits | 1 << Y
will "set" a single bit in digits - it will set the Yth bit.So, each loop sets a bit in digits.
|是按位或。但该代码检查长度为 n 的 int 是否包含所有数字 1..n。这与回文检查不同。如果
n
的最后一位数字是i
,该行将digits
的第 (i-1) 位设置为 1。 [顺便说一句,代码是错误的:如果n
包含零数字,该行将触发“未定义的行为”:将整数移位负数会给出未定义的结果。]代码使用整数
digits
表示一组数字。您可以通过搜索位集来了解有关该技术的更多信息。| is bitwise or. But the code checks whether an int of length n has all digits 1..n. This is different from palindrome check. That line sets's (i-1)'th bit of
digits
to 1 if the last digit ofn
isi
. [BTW, the code is wrong: ifn
contains a zero-digit, that line will trigger "undefined behavior": shifting an integer by a negative amount gives an undefined result.]The code uses an integer
digits
to represent a set of digits. You can learn more about the technique by searching for bit sets.它似乎正在执行按位或。
It appears to be performing a Bitwise Or.
|
是按位OR
按位OR 采用两个长度相等的位模式,并对每对对应位执行逻辑“或”运算。如果第一位为 1 或第二位为 1 或两位均为 1,则每个位置的结果为 1;否则,结果为 0。
示例:
http://en.wikipedia.org/wiki/Bitwise_operation
|
is a bitwiseOR
A bitwise OR takes two bit patterns of equal length and performs the logical inclusive OR operation on each pair of corresponding bits. The result in each position is 1 if the first bit is 1 OR the second bit is 1 OR both bits are 1; otherwise, the result is 0.
Example:
http://en.wikipedia.org/wiki/Bitwise_operation
|
是按位或。所以该行正在执行
digits =digits | (1 << (int)((n % 10) - 1));
|
is a bitwise or.So the line is doing
digits = digits | (1 << (int)((n % 10) - 1));