c++ 中一行代码的解释与位移有关

发布于 2024-12-25 22:24:24 字数 450 浏览 1 评论 0原文

我不希望有人解释以下代码是如何工作的(它检查 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

锦上情书 2025-01-01 22:24:24

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

数字 = 数字 | 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.

长途伴 2025-01-01 22:24:24

|是按位或。但该代码检查长度为 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 of n is i. [BTW, the code is wrong: if n 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.

安静 2025-01-01 22:24:24

它似乎正在执行按位或。

It appears to be performing a Bitwise Or.

拥抱没勇气 2025-01-01 22:24:24

| 是按位OR

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

示例:

10010000
01010000
--------
11010000

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

| is a bitwise OR

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:

10010000
01010000
--------
11010000

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

断念 2025-01-01 22:24:24

| 是按位或。

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

| is a bitwise or.

So the line is doing digits = digits | (1 << (int)((n % 10) - 1));

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文