什么<<意思?

时间:2015-08-10 03:07:20

标签: c#

感谢您查看此问题。

我在传统的for block中看到了以下代码片段,但不确定它在其上下文中的重要性。

index <<= 1;

有关更多上下文,这里是完整的代码块。

ulong index = 1;
int distance = 0;
for (int i = 0; i < 64; i++)
{
    if ((hash1 & index) != (hash2 & index))
    {
        distance++;
    }

    index <<= 1;
}

是否只是确保索引仍为1,如果不是,则将其值返回1?

其次,这是什么叫,所以我可以再读一遍。

最后,感谢您抽出时间和考虑此事。

2 个答案:

答案 0 :(得分:9)

有问题的代码正在旋转一对64位哈希值(可能为ulong,如index),并检查之间的差异他们。我将使用4位值作为示例目的,但原理是相同的。

 if ((hash1 & index) != (hash2 & index))

&运算符正在执行按位AND运算。当散列与索引值进行AND运算时,您将返回0或索引值,具体取决于特定位是0还是1.(1010 & 0010 == 00101010 & 0100 == 0000 )。
如果两个AND都产生0,或者两者都产生索引值,则哈希的两个位匹配。否则,他们就不会,我们distance++;表示他们比我们之前知道的要多一点。

index <<= 1;

该行仅将索引数字颠覆到下一位。它通过将旧索引(以1开头,等于0001)和left shifting一个地方(<< 1),然后将其设置回index变量<<=而不是<<)。因此,在第一个循环之后,index将是0010,然后是0100,依此类推。

这具有乘以2的效果,但这不是它的预期用途。

总的来说,通过此算法运行distance0011,您得到的1111为2,因为两位不同。

答案 1 :(得分:3)

代码

index <<= 1;

左移一位。在这种情况下,它与乘以2具有相同的效果。但请参阅注意事项。