2016-09-30 12 views
0

Java에서 유한 필드를 구현하려고합니다.이를 위해 두 개의 이진수를 XOR해야합니다.예기치 않은 결과를 Java에서 제공합니다.

  String lastdigits="1000110"; 
      int overflow=11; 
      int lastdigitsint=Integer.parseInt(lastdigits); 
      int result=(int) lastdigitsint^overflow; 

변수 '오버 플로우'의 값은 11입니다 : 다음은 내 코드입니다. 오버 플로우 (= 11)로 lastdigitsint를 XORing 할 때 출력은 1000101이어야합니다. 그러나 코드는 1095를 출력합니다.

왜 이런 일이 발생하는지 설명 할 수 있습니까? 고맙습니다.

+1

이 예제를 간단하게 단순화하고 하드 코딩 된 값 –

+0

을 제공 할 수 있습니다. 나는 StackOverflow를 처음 사용하기 때문에 여기서 규칙을 배우고있다. 안내 주셔서 감사합니다! – kudesiaji

+0

또한 최소한의 코드를 편집했습니다. 예, IntelliJ에서 디버깅했는데 올바른 값이 'lastdigits'변수와 'overflow'변수에 저장되고 있다고 확신합니다. – kudesiaji

답변

1

이 처음부터 잘못

String lastdigits="1000110"; 
    int lastdigitsint=Integer.parseInt(lastdigits); 

마지막 숫자 값은 1,000,110 될 것입니다 - 열 houndred 수백만 열 먹으 렴 그래서 이진 표현은 무엇을 기대에서 멀리 다르다. 당신이 원하는 것은 단순히 :

int lastdigitsint=0b1000110; 

이 적절한 진 정수입니다. 그래서

:

public static void main(String[] args) { 
    String lastdigits = "1000110"; 
    int overflow = 0b11; 
    int lastdigitsint = Integer.parseInt(lastdigits); 
    int result = lastdigitsint^overflow; 

    System.out.println("Dec:" + lastdigitsint); 
    System.out.println("Dec:" + overflow); 
    System.out.println("Dec:" + result); 
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint)); 
    System.out.println("Bin" + Integer.toBinaryString(overflow)); 
    System.out.println("Bin" + Integer.toBinaryString(result)); 

    System.out.println("And now the proper way:"); 
    lastdigitsint = 0b1000110; 
    result = lastdigitsint^overflow; 

    System.out.println("Dec:" + lastdigitsint); 
    System.out.println("Dec:" + overflow); 
    System.out.println("Dec:" + result); 
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint)); 
    System.out.println("Bin" + Integer.toBinaryString(overflow)); 
    System.out.println("Bin" + Integer.toBinaryString(result)); 
} 

결과 : 나에게 합법적

Dec:1000110 
Dec:3 
Dec:1000109 
Bin:11110100001010101110 
Bin:11 
Bin:11110100001010101101 
And now the proper way: 
Dec:70 
Dec:3 
Dec:69 
Bin:1000110 
Bin:11 
Bin:1000101 

솔기.

+0

답장을 보내 주셔서 감사합니다. 이 숫자의 이진 표현이 다른 이유를 설명해주십시오. (이 코드는 다른 바이너리 숫자로 작동하기 때문에 큰 숫자도 입력합니다.) – kudesiaji

+0

또한 lastdigitsint의 값을 하드 코드 할 수 없습니다. 이것은 내 전체 프로그램의 일부 코드 일 뿐이며 ford 루프에 의해 String lastdigits가 생성됩니다. 올바른 출력을내는 다른 방법이 있습니까? – kudesiaji

+0

문제는 11b (3dec)가 아닌 11dec (1011bin) – Antoniossss

1

당신이 생각하는 xoring 숫자가 아닙니다. 당신이 11110100001010100101에 어떤 결과 진수 111101000010101011101011을 XOR 연산되도록 당신은 열한

XOR 그 두 숫자의 이진 표현의 비트에 수행에 백만 백열을 XOR 연산하는

. 흥미로운 부분은 해당 숫자의 십진수 표현이 1000101인데 이진수가 100011011 인 경우 정확히 얻을 수있는 결과의 이진 표현입니다. 당신은 이진수 100011011을 XOR하려면

Decimal  Binary 

1000110 == 11110100001010101110 
          ^
    11 == 00000000000000001011 
      -------------------- 
1000101 == 11110100001010100101 

, 당신은 작성해야 :

 String lastdigits="1000110"; 
     int overflow=3; // 11 in binary is 3 in decimal 
     int lastdigitsint=Integer.parseInt(lastdigits,2); 
     int result=(int) lastdigitsint^overflow; 

당신에게 (누구의 이진 표현이다 1000101) 십진수 69를 줄 것이다 그.