2014-12-15 1 views
1

에서 다른 결과를 제공합니다. 연습을 위해 Java 및 Python으로 방송 IP 주소 코딩을 시도하고 있습니다. - 그 마스크를 나타내는 숫자 여기 decimalIP자바와 파이썬은 논리 연산자

public IPv4Address getBroadcastAddress() throws IllegalArgumentException { 
    long bits = 0; 
    bits = this.address.decimalIP()^(~(0xffffffff^(1L << 32 - getMaskLength()) - 1)); 
    IPv4Address broadcast = new IPv4Address(bits); 

    return broadcast; 
} 

는 IP 주소, getMaskLength를 나타내는 숫자입니다 : 여기 나에게 정확한 출력을 제공 자바 내 코드입니다. 여기에 예상 방송 주소가 있습니다. 모든 구성 요소가 자바와 같은 항목을 나타내는 다음

def broadcastaddress(self): 
    return IPv4Address(self.address.decimalip^(~(0xffffffff^(1 << 32 - self.mask) - 1))) 

: 파이썬에서 같은 논리를 사용하여 나는 예기치 않은 결과를 얻었다. 디버깅 후 그 숫자가 (~(0xffffffff^(1 << 32 - self.mask) - 1))이 부정적입니다. 문서 연산자에서 ~ 비트 반전을 제공하지만 왜 파이썬이 아닌 Java에서이 숫자가 음수인지 이해할 수 없습니까?

+1

나는 모든 호출을 제거하고 Java 및 Python의 각각의 짧고 완전한 프로그램에 값을 하드 코딩하는 것으로 시작합니다. 그런 다음 각 단계를 별도의 명령문으로 만드십시오. 그러면 어떤 동작이 다른 동작을하는지 정확하게 볼 수 있습니다. –

+0

자바에서는 (~ (0xffffffff^(1L << 32-getMaskLength()) -> 1) ~ = ~ (1L << 32-getMaskLength()) - 1)) – sol4me

+0

@ sol4me : '(1L << 32-getMaskLength()) - 1)'과 같은 것을 돌려줍니다. 그리고 하나는 2의 보수가 아닌 하나의 보수를 사용해야합니다. –

답변

1

파이썬 정수 경계되지 않고 서명되지 않은, 그래서 ~는 음수를 만듭니다 서브넷 마스크에 대한 작업이 필요 동안

>>> hex(~(0xffffffff^(1 << 32 - 24) - 1)) 
'-0xffffff01' 
>>> ~(0xffffffff^(1 << 32 - 24) - 1) 
-4294967041 

그러나, 자바 ~, 당신에게 2의 보수을 줄 것이다 의 하나의 보수는이며, 이는 넷 마스크에 XOR을 사용하여 얻을 수 있습니다. 그 이후 취소하려는 당신이 이미 적용XOR 작동, 당신은 모든 여기 1의 보수를 사용할 필요가 없습니다 기타 : 난 당신이 여기 IPv4Network.broadcast_address를 사용할 수 있다고 의심

return IPv4Address(self.address.decimalip^((1 << 32 - self.mask) - 1)) 

:

network = IPv4Network('{}/{}'.format(self.address.decimalip, self.mask) 
return network.broadcast_address` 
+0

나는 당신의 대답에 작은 의심을 품고 있습니다. 내가 생각하기에 두 언어 모두에서 '~'가 같다고 가정합니다 (즉, 양쪽 모두 음수를 나타냅니다). 문제는 당신의 대답에 언급 된 이유가'^ '일 때뿐입니다. 내가 틀렸다면 나를 바로 잡아라. 타이. –

+0

@BhargavRao : 당신이 무엇을 요구하고 있는지 완전히 확신하지 못합니다. 브로드 캐스트 마스크를 계산하는 것이 훨씬 간단하기 때문에 대부분 문제를 피했습니다. –

+0

브로드 캐스트 마스크를 계산한다는 목표는 묻지 않습니다. OP는 Java와 Python의'~'의 차이점을 물었습니다. 그의 질문과 그의 코드 행에 관해서는 문제는'~'가 아니라'0xffffffff'에 있습니다. 그래서 나는이 점을 분명히 해달라고 부탁했다. –