2013-02-27 3 views
0

Я играю в игру, и в базе данных мы устанавливаем 100663296 как лидер GM, но также это поле в базе данных записывается для разных вещей, поэтому оно меняет это число до 100794368 Мне сказали возможно, используйте bit-wise check, чтобы проверить, совпадает ли первый номер с вторым номером, и я использовал google с использованием bit-wise checks, но путался, что использовать для моей проверки.Побитовая проверка в Javascript

Вот некоторые другие цифры, которые меняются, в том числе один сверху.

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 */) 

Этот шов работает отлично.

также thx to vr1911428 и все остальные за помощью по этому вопросу.

+0

Если у вас нет всех возможных значений бит-масок и их значений, будет немного сложно сделать указанную проверку. Я верю , –

+1

Я не понимаю. Условие 12345 = 12666 обусловлено 12 = 12? – apoq

+0

Фабрико справа. В самом деле, вам нужно знать, какой бит вы ищете в маске. – Aurand

ответ

0

Так давайте преобразуем эти числа в двоичном представлении (беззнаковое целое):

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

Обратите внимание, что последний номер выходит за рамки JavaScripts bitwise arithmetic, который работает только с 32-битным подписал целые числа - вы не сможет использовать самый левый бит.

Итак, какие биты вы хотите сравнить сейчас? Есть много возможностей, приведенная выше схема не дает понять, но похоже, что вы ищете 27-й бит справа (2 = 67108864). Для сопоставления с ним, вы можете применить бинарную и битовую маску:

x & Math.pow(2, 26) 

, который должен оценить 2 снова или ноль - так что вы можете просто проверить truthiness. Btw, вместо использования pow вы можете использовать шестнадцатеричную нотацию: 0x4000000. При том, что ваше состояние будет выглядеть следующим образом:

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

thx для ответа на этот вопрос. Я также просмотрел код C++ для своего сервера и нашел этот раздел. FLAG_GM = 0x04000000, FLAG_GM_SUPPORT = 0x04000000, FLAG_GM_SENIOR = 0x05000000, FLAG_GM_LEAD = 0x06000000, FLAG_GM_PRODUCER = 0x07000000, – whitevamp

0

Если вам необходимо проверить для полного поразрядного равенства двух целых чисел, все, что вам нужно, это просто «==» оператора, но и использовать его, вы должны гарантировать, что оба операнда являются целыми числами:

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

Будьте очень осторожны; если хотя бы один из операндов строка, представляющая число, не число, оба операнда будут рассмотрены строки, и вы можете получить запутанные результаты:

left = ""; 
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
Это всё, в принципе. ...................

Смежные вопросы