gpt4 book ai didi

c# - 我数学很差,我想做二元运算

转载 作者:行者123 更新时间:2023-12-03 20:38:11 24 4
gpt4 key购买 nike

我有以下代码:

    public void AddHash( int val )
{
m_Hash ^= (val & 0x3FFFFFF);
m_Hash ^= (val >> 26) & 0x3F;
}

我非常想知道它到底做了什么,但我很高兴知道如何构建一个告诉我 m_Hash 是否有该数字的 bool HasHash( int val ) ...

类似这样的东西吗?

    public bool HasHash( int val )
{
return (m_Hash & val) == 0;
}

最佳答案

编辑以修复@schnaader发现的错误:它有什么作用?这段代码可能想要旋转val向左(顺时针)移动 6 位并形成该旋转值与当前值的补码和(编辑:不是乘积,正如我之前所说的) - 异或 - m_Hash产生一个新的m_Hash 。那个新的m_Hash下次会用到AddHash( )被调用。

但是,编写的代码有一个错误:它只旋转 val 的高位 6 位。向左,保留 val 的低位 26 位。然后代码将三个值异或在一起:

  1. val的新低位(旧高位)6位;
  2. val 的原始未移位低位 26 位;和
  3. m_Hash的当前值

将结果保留在 m_Hash 中。

它是如何做到的?您可以将其映射出来并进行模拟:

  1. val & 0x3FFFFFF表示提取val的低26位。
  2. xor当前值为m_Hash的那26位

  3. 现在轮类val向右,使得低位 26 位从低位端消失,留下 val 原来的高位 6 位。 val的低6位.

  4. mask 带有 0x3f仅提取那些低位 6 位(以防一些无关位被移入 val 的高位部分)。
  5. xor当前值为 m_Hash 的低 6 位给予新的m_Hash .

您知道旋转和异或是计算哈希时的常见操作。

编辑: @schnaader 指出了原始代码中的错误:该代码忘记执行旋转的另一部分:将低位 26 位左移 6。要解决此问题,代码应如下所示:

public void AddHash( int val )
{
m_Hash ^= ((val & 0x3FFFFFF) << 6);
m_Hash ^= (val >> 26) & 0x3F;
}

至于你的HasHash( )功能:这句话你应该知道

return (m_Hash & val) == 0;

在许多情况下都会返回 TRUE,包括一些您可能不想要的情况。例如,如果m_Hash == 0xC0,该函数将返回TRUE。和val == 0x03 .

关于c# - 我数学很差,我想做二元运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com