Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解释c+中的一行代码+;与位移位相关_C++_Bit Shift - Fatal编程技术网

C++ 解释c+中的一行代码+;与位移位相关

C++ 解释c+中的一行代码+;与位移位相关,c++,bit-shift,C++,Bit Shift,我不希望有人解释下面的代码是如何工作的(它检查int是否是泛数字的),因为我自己应该这样做。我只需要帮助我具体理解第8行。我不知道那家伙在干什么 private bool isPandigital(long n) { int digits = 0; int count = 0; int tmp; while (n > 0) { tmp = digits; digits = digits | 1 << (int)(

我不希望有人解释下面的代码是如何工作的(它检查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;
}
private bool isPandigital(长n){
整数位数=0;
整数计数=0;
int tmp;
而(n>0){
tmp=数字;

digits=digits | 1似乎在执行按位Or。

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


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

|
是按位

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

例如:

10010000
01010000
--------
11010000

|
是位or


所以这行代码是digits=digits |(1我知道其他人已经解释过它是位OR,但我想给出我自己的解释

digits=digits | X
将把X中的所有1位复制为数字


digits=digits | 1终于找到了如何设置代码部分的格式。Ctrl-K制胜!值得注意的是,实际阅读可以为您做些什么。尽管我觉得当您单击“代码”时,这应该位于描述的顶部,因为它实际上并不那么明显。此代码永远不会返回真值。您确定吗?我从以下来源获得它:我应该认为如果它dn不起作用他就不能解决这个问题。@Dani想给出一个它不起作用的原因吗?我想如果输入
123
出现???
是位Or运算符,你认为它还能做些什么?请查看此处以获得更详细的位Or解释:Als->Yes.-)假设他没有使用C++的神秘变体。你把括号搞错了。ZVRBA:Downvote应该帮助人们改进。不是吗?和数字=数字(int)((n % 10)-1)相同吗?@ EMSHOSCHC:没有办法!它们是不同的。你的代码只是乘法<代码>(int)((n % 10)-1)。)
乘以2,而原始代码将
1
乘以2的幂,其中幂=
(int)((n%10)-1))
Oh wow ya应该已经知道了,因为某些原因,只有变量才能被乘以。谢谢你,这把我在过去30分钟里学到的所有东西都放在了一起。你基本上把2提高到了yth的幂,在二进制中就是yth位。然后,不管它是什么,数字中的位都被设置为1。然后代码中的后续行检查数字是否发生了变化,如果有,则显示数字中的位最初为0,因此我们知道这是我们第一次看到该数字。对所有数字1到9执行此操作,如果数字总是变化,则每个数字都包含一次,因此是泛数字。对吗?是的,这就是my mental debugger告诉我:-)我注意到如果输入有
0
,这将不起作用,因为这将产生负移位。我不确定泛数字的定义,但对于
123
1234
123456789
等以及任何混乱,此代码将返回true,但对于
124
2我如何在这个网站上跟踪你,这样我就被告知你问和回答的问题?我问你这个问题,因为你的答案是如此的清晰和简练,我觉得有义务读更多你所写的东西来学习C++的一些更深层次的复杂之处。这是不正确的,因为它是针对一个项目euler问题的,所以整数永远不应该包含零。但是我可以看到潜在的问题。