2012-03-24 10 views
6

Я вычисляю XOR из двух short integers используя XOR ^ Оператор традиционной моды. Ниже ме-XOR двух коротких целых чисел

short a=197; 
short b=341; 
short y = (short) (a^b); 

Однако XOR всегда возвращается целое число, но в моем случае входы короткое целое, поэтому я литье короткое замыкание на выходе XOR. XOR можно рассчитать по-разному (пример: с использованием BigInteger и т. Д.), Но с точки зрения производительности (меньше времени), что является лучшим для коротких целых чисел? Помня о производительности, следует ли сначала преобразовать каждое короткое целое число в двоичный номер с помощью Integer.toBinaryString(number), а затем применить побитовое XOR?

ответ

8
short s1 = ... 
short s2 = ... 
short result = (short) (s1^s2); 

Это наиболее эффективный способ XOR двух short вместе. Он не сталкивается с накладными расходами на создание BigInteger s, и приведение не вызовет проблемы с переполнением, так как оба значения s1 и s2 - это short s для начала.

4

Не совсем понятно, что вы подразумеваете под «преобразовать каждое короткое целое число в двоичное число» - короткий - это уже число, и его представление, естественно, является двоичным.

Вы просто хотите:

short x = ...; 
short y = ...; 
short z = (short) (x^y); 

Вам нужно бросание в x^y будет способствовать как к int, и результат будет int. Тем не менее, результат должен быть в диапазоне short в любом случае, так что безопасно выполнять этот отбор без потери информации.

Для получения дополнительной информации о XOR в частности и section 5.6.2 см. section 15.22.1 of the JLS для получения информации о двоичном цифровом продвижении в целом.

+0

@EricJ .: Вы все еще смотрели версию, где у меня не было круглых скобок вокруг '(x^y)'? Я исправил это некоторое время назад :) –

+0

Да, я вижу обновление. Вывод комментария :-) –

+0

@JonSkeet: «Преобразовать каждое короткое целое число в двоичное число» «Я имел в виду, что должен сначала преобразовать каждое короткое целое в двоичную строку с помощью« Integer.toBinaryString (number) », а затем применить« побитовый XOR » ? –

1

Я не 100% уверен, что вы просите, но надеюсь, что это помогает:

Java принуждают оба операнда к типу внутр. Вот почему результатом является int.

http://java.comsci.us/syntax/expression/bitwisexor.html

так что ваши шорты будут автоматически преобразованы в междунар, и операция XOR будет сделано очень эффективно на целочисленных операндов.

Если один из операндов длинный, оба типа вместо этого принуждаются к длинному. Однако это не относится к вашему делу.

Практический результат, учитывая, что оба ваших входов короткие, если вам нужен короткий результат, наиболее эффективным, что нужно сделать, это

short result = (short) (operandA^operandB); 
Смежные вопросы