感谢您查看此问题。
我在传统的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?
其次,这是什么叫,所以我可以再读一遍。
最后,感谢您抽出时间和考虑此事。
答案 0 :(得分:9)
有问题的代码正在旋转一对64位哈希值(可能为ulong
,如index
),并检查位之间的差异他们。我将使用4位值作为示例目的,但原理是相同的。
if ((hash1 & index) != (hash2 & index))
&
运算符正在执行按位AND运算。当散列与索引值进行AND运算时,您将返回0或索引值,具体取决于特定位是0还是1.(1010 & 0010 == 0010
和1010 & 0100 == 0000
)。
如果两个AND都产生0,或者两者都产生索引值,则哈希的两个位匹配。否则,他们就不会,我们distance++;
表示他们比我们之前知道的要多一点。
index <<= 1;
该行仅将索引数字颠覆到下一位。它通过将旧索引(以1
开头,等于0001
)和left shifting一个地方(<< 1
),然后将其设置回index
变量<<=
而不是<<
)。因此,在第一个循环之后,index
将是0010
,然后是0100
,依此类推。
这具有乘以2的效果,但这不是它的预期用途。
总的来说,通过此算法运行distance
和0011
,您得到的1111
为2,因为两位不同。
答案 1 :(得分:3)
代码
index <<= 1;
左移一位。在这种情况下,它与乘以2具有相同的效果。但请参阅注意事项。