2012-03-24 2 views
6

나는 연산자를 사용하여 두 가지 중 XOR 두 가지를 계산하고 있습니다. 아래 방법 -두 개의 짧은 정수의 배타적 논리합

short a=197; 
short b=341; 
short y = (short) (a^b); 
배타적 논리합은 항상 정수를 반환하지만

하지만 내 경우 입력의 짧은 정수 i는 XOR 출력에 짧은 주조있는 이유 즉,하는 것입니다. XOR은 다른 방식으로 계산할 수 있지만 (예 : BigInteger 등을 사용) 짧은 정수의 경우 성능이 현명하고 (시간이 단축됩니까?) 성능을 염두에 두면서, 먼저 각각의 짧은 정수를 Integer.toBinaryString(number)을 사용하여 이진수로 변환해야합니까? 그렇다면 비트 XOR을 적용 하시겠습니까?

답변

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

이 두 short을 XOR하는 가장 효율적인 방법입니다, 짧은 주어진

결론은, 함께. BigInteger을 생성하는 오버 헤드가 발생하지 않으며 시작하기 위해 short 초일 때 s1s2이 모두 캐스팅되어 오버 플로우 문제가 발생하지 않습니다.

4

"각 짧은 정수를 2 진수로 변환"하는 것이 의미가 명확하지 않습니다. 짧은 것은 이미 숫자이며 그 표현은 자연스럽게 이진수입니다.

당신은 원하는 : x^yint에 모두를 촉진하고, 결과가 int 수있는 바와 같이,

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

당신은 캐스트가 필요합니다. 그러나 결과는 short의 범위에 있어야하므로 정보를 잃지 않고이 캐스트를 수행하는 것이 안전합니다.

특히 XOR에 대한 자세한 내용은 section 15.22.1 of the JLS을, 이진 숫자 승격에 대한 자세한 내용은 section 5.6.2을 참조하십시오.

+0

@ EricJ :'(x^y)'의 괄호가없는 버전을 계속보고 계셨습니까? 나는 얼마 전에 그것을 고쳤다 :) –

+0

그래, 나는 갱신을 본다. 코멘트를 철회하기 :-) –

+0

@JonSkeet : 각각의 짧은 정수를 2 진수로 변환 ""하기 때문에 먼저 정수를 정수형으로 변환 한 다음 '비트 XOR'을 적용해야합니다. ? –

1

는 당신이 요구하는지 100 % 확신하지만, 희망이 도움이됩니다 :

자바는 두 피연산자가 int 유형으로 강제 변환. 이것이 결과가 int 인 이유입니다.

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

그래서 당신의 반바지가 자동으로 int로 변환 될 것이며, XOR 연산은 정수 피연산자에 매우 효율적으로 수행됩니다.

피연산자 중 하나가 long이면 두 유형 모두 대신 long으로 강제 변환됩니다. 그러나 귀하의 경우에는 해당되지 않습니다. 사용자의 입력을 모두 당신이 짧은 결과를 필요로하는 경우, 할 수있는 가장 효율적인 것은

short result = (short) (operandA^operandB);