2016-01-07 4 views
1

Я пытаюсь преобразовать код javascript в код C#. В какой-то момент, в JavaScript, у меня есть выражение вроде этого:Как сделать результат xor равным в C# и javascript

var result = 8797569417216^909522486; 

то переменная результата содержит значение 1849046582. Я слышал, что Javascript использует номера 32bit для операторов поразрядными, но я не знаю, как используйте эту информацию, чтобы получить те же результаты в C#. Когда я запустил ту же строку кода, результат содержит 8797942068790.

Что мне не хватает?

+0

Вы хотите получить такой же результат? В результате вы ошибаетесь - C# дает правильное значение ... –

ответ

3

Вы можете конвертировать результат в int:

var result = 8797569417216^909522486; 
var realResult = unchecked((int) result); 

Note бесконтрольное, потому что вы цените явно больше, чем Int32.

+1

Приложение: просто не забудьте MAX_SAFE_INTEGER в JavaScript (9007199254740991), после того, как результат этого значения будет отличаться, поскольку числа в JS хранятся в плавающей запятой. –

0

Проблема в том, что 8797942068790 не может быть представлен 32-битным, и, таким образом, C# обрабатывает его как 64-разрядный. Однако вы можете преобразовать обратно (по значению) в 32 бит, используя:

x & ((1L<<32)-1) 

Это работает следующим образом. 1L означает, что вы представляете 1 с использованием 64-разрядного long. Затем вы перемещаете его налево на 32 места. Это означает, что вы получаете значение, которое только выше максимального числа, представленного с 32 бит. Путем вычитания 1, все 32 лучших бит один, а все остальные нулю, так: ((1L<<32)-1) двоичного кода равна:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 

Теперь с помощью побитового &, вы тем самым маскировать все значения, что не может быть представлен 32 немного.

Так для примера, это означает:

csharp> (8797569417216^909522486)&((1L<<32)-1) 
1849046582 

(используется в csharp интерактивной оболочки).

После этого вы можете преобразовать результат в int или uint. uint не имеет знака, и поэтому гарантируется, что значение может быть сохранено в uint. Однако uint не может работать с отрицательными номерами.

+0

Маскирование в этом случае является излишним (хотя может быть полезно знать), и у вас все еще есть проблема преобразования 'long' в' int' (но мы не знаем наверняка, хочет ли OP 'Int32' в качестве результата или нет). – Sinatr

+0

@Sinatr: в этом случае можно использовать 'uint'. Я согласен, что использование «unchecked» - лучший способ. Тем не менее, полезно знать, как использовать несколько битаков. –