0

我玩一个游戏,在数据库中我们将 100663296 设置为 GM 领导者,但数据库中的这个字段也被写入不同的东西,所以它将该数字更改为 100794368 我被告知可以使用 abit-wise check来检查第一个数字与第二个数字相同,我已经用谷歌搜索过使用bit-wise checks但对我的支票使用什么感到困惑。

以下是其他一些变化的数字,包括上面的数字。

predefined number   new changed number/ever changing number.
100663296       =       100794368
67108864        =       67239936
117440512       =       2231767040

那么我应该如何检查这些数字呢?

这是我在注意到数字变化之前使用的代码的一部分。

if (playerData[i].nameflags == 67108864) 
{ 
    playerRows += '<img src ="icons/GM-Icon.png" alt="GM" title="GM"></img>';
}

谢谢Bergi,以获得答案。

    if (playerData[i].nameflags & 0x400000 /* === 0x400000 */)

这个接缝很好用。

也感谢 vr1911428 和其他所有人的帮助。

4

2 回答 2

0

因此,让我们将这些数字转换为二进制表示(无符号整数):

> 100663296
00000110000000000000000000000000
> 100794368
00000110000000100000000000000000
> 67108864
00000100000000000000000000000000
> 67239936
00000100000000100000000000000000
> 117440512
00000111000000000000000000000000
> 2231767040
10000101000001100001000000000000

请注意,最后一个数字超出了JavaScript 按位算术的范围,它仅适用于 32 位有符号整数 - 您将无法使用最左边的位。

那么你现在想比较哪些位?有很多可能性,上面的方案没有说清楚,但看起来你正在寻找右边的第 27 位(2 26 = 67108864)。要匹配它,您可以应用二进制 AND 位掩码:

x & Math.pow(2, 26)

它应该再次评估为 2 26或为零 - 所以你可以检查真实性。顺便说一句,pow您可以使用十六进制表示法而不是使用:0x4000000. 这样,您的情况将如下所示:

if (playerData[i].nameflags & 0x400000 /* === 0x400000 */)
于 2013-02-28T00:41:00.807 回答
0

如果你需要检查两个整数的完全按位相等,你只需要'=='运算符,但要使用它,你应该保证两个操作数都是整数:

left = 12323;
right = 12323;
if (left == right)
   alert("Operands are binary equal; I'll guarantee that. :-)");

不过要非常小心;如果至少有一个操作数是表示数字的字符串,而不是数字,则这两个操作数都将被视为字符串,您可能会得到令人困惑的结果:

left = "012323";
right = 12323;
if (left != right)
   alert("Operands are not equal, even though they represent 'equal values', as they     are compared as strings.");

总的来说,这些天来,试图用表示数据的字符串而不是数据本身来操作是对初学者的真正诅咒。很难向他们解释。在 JavaScript 中尤其难以解释,其松散类型的类型概念本身就是非常复杂且难以理解的,背后是虚幻的简单。

最后,如果您需要比较单独的位(并且,根据您的问题,我认为不需要),您可以使用二元运算符:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
基本上就是这样。.....................

于 2013-02-28T03:17:59.873 回答