按位检查Javascript

时间:2013-02-27 23:45:29

标签: javascript jquery ajax

我玩游戏,在数据库中我们将100663296设置为GM Leader,但数据库中的此字段也会被写入不同的内容,因此它将该数字更改为100794368 我被告知可能使用bit-wise check来检查第一个数字是否与第二个数字相同,我使用bit-wise checks搜索,但对我的支票使用内容感到困惑。< / p>

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

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>';
}

thx to Bergi,答案。

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

这种接缝效果很好。

也是诉到vr1911428 以及其他所有人的帮助。

2 个答案:

答案 0 :(得分:0)

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

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

请注意,最后一个数字超出JavaScripts bitwise arithmetic的范围,只适用于32位带符号的整数 - 您将无法使用最左边的位。 / p>

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

x & Math.pow(2, 26)

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

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

答案 1 :(得分: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
就是这样,基本上。 ...................