2013-06-12 1 views
0

В Ruby:Получение того же результата с Руби, как JavaScript, для побитового XOR

-1104507^3965973030 => -3966969949 

В Javascript:

-1104507^3965973030 => 327997347 

Кто-то спросил similar question here но ответ только указал на обертку для закрытия. Мне нужен способ получить те же ответы от Ruby, что и для JavaScript, чтобы я мог переносить этот код.

Мне нужен способ получить результат JavaScript из любого A^B в Ruby для любых целых чисел A и B.

+0

Вы должны будете использовать [библиотеку bignum, которая поддерживает побитовый XOR] (https://github.com/justmoon/node-bigint), или написать твой собственный. –

+0

Ум, №. Не нужно bignum. –

ответ

1

Эти два : такой же результат, по модулю 2 . В Ruby вы могли бы & 4294967295 сделать результат таким же, как в Javascript.

Чтобы охватить все случаи, необходимо учитывать, что Javascript считает двоичные значения подписанными 32-битные целые числа. Ruby, с другой стороны, произведет unsigned 32-битные целые числа от операции & 4294967295.

Так, в Javascript просто:

c = a^b 

Чтобы получить то же самое в Ruby:

c = (a^b) & 4294967295 
c -= 4294967296 if c > 2147483647 
+0

как насчет '332763^2714866558'. Это дает «2715058341» в рубине и '-1579908955' в JS. И если вы делаете '2715058341 & 4294967295', то все равно' 4294967295' – babonk

+1

Вы имеете в виду, что это все еще 2715058341. См. Мой ответ. –

0

Благодаря Mark Adler для начального кончике, я думаю, что это способ сделать это алгоритмический:

max_32_int = (2**32) 

c = a^b 

if c > (max_32_int/2) 
    c = c - max_32_int 
elsif c < -(max_32_int/2) 
    c = c + max_32_int 
end 
+0

Вам нужен только один 'if'. См. Мой ответ. –

+0

ну, у вас есть '&' и '-'. Мина использует '+' и '-'. Такое же количество операторов, нет? – babonk

+1

Операции 'if' замедляют работу, так как они воюют с исполняемыми модулями ожидания. Даже если у вас было больше операторов, но меньше «if», это было бы победой. Таким образом, один менее «если» и такое же количество операторов - определенно победа. Я должен увидеть, могу ли я избавиться от оставшихся «if» с большим количеством операторов. –

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

  • Нет связанных вопросов^_^