2013-06-12 30 views
0

在Ruby:充分利用紅寶石一樣的結果JavaScript進行按位異或

-1104507^3965973030 => -3966969949 

在Javascript中:

-1104507^3965973030 => 327997347 

有人問一個similar question here但得到的答覆只是指出,對於封閉的包裝。我需要一種方法來從Ruby獲得相同的答案,因爲我可以使用JavaScript來移植這些代碼。

我需要一種能夠從Ruby的任何A^B得到任何整數AB的JavaScript結果的方法。

+0

你需要使用(https://github.com/justmoon/node-bigint)支持按位異或一個BIGNUM庫],或寫你自己。 –

+0

恩,沒有。不需要高粱。 –

回答

1

那兩個結果相同,模2 。在Ruby中,您可以使& 4294967295使結果與Javascript中的結果相同。

要覆蓋所有情況,您需要考慮到Javascript考慮的二進制值爲,簽名爲的32位整數。另一方面,Ruby將從& 4294967295操作產生無符號的 32位整數。

所以,在Javascript簡單:

c = a^b 

要得到同樣的事情在Ruby中:

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

'332763^2714866558'。這個在ruby中給出了'2715058341',在JS中給出了'-1579908955'。如果你做了'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'語句會減慢速度,因爲它們會與前瞻執行單元混淆。即使你有更多的經營者,但是更少的「如果」,這將是一場勝利。所以少一個'如果'和相同數量的運營商肯定是一場勝利。我應該看看是否可以讓更多的操作員擺脫剩餘的「如果」。 –