2014-08-05 5 views
0

는, 다음과 같은 코드가 올바른 결과 자바 스크립트 (Node.js를)에서 (-18027917)조로 파이썬 2.7에서

from __future__ import print_function 

def twos_comp(val, bits): 
    if (val & (1 << (bits - 1))) != 0: 
     val -= 1 << bits 
    return val 

valBinary = "110111011001110101001110011" 
print(twos_comp(int(valBinary, 2), len(valBinary))) 

를 반환하는 다음과 같은 코드를 파이썬/자바 스크립트 다른 결과를 보완 코드는 잘못된 결과 (1995238003)

function toTwosComplement(val, bits) { 
    if ((val & (1 << (bits - 1))) != 0) { 
     val -= (val - 1) << bits; 
    } 
    return val; 
} 

valBinary = "110111011001110101001110011"; // same as python example 
console.log(toTwosComplement(parseInt(valBinary, 2), valBinary.length)); 
,691,363을 반환210

분명히 비트 연산자 (또는 int/parseInt)의 동작에 다른 점이 있지만 그 코드가 무엇인지 알 수는 없습니다.

+0

'val'과 'bits'에 대해 올바른 값을 전달하면 결과가 변경됩니까? 이렇게하면'parseInt'가 원인으로 배제되어'toTwosComplement'가 남습니다. – delnan

답변

6

먼저

val -= (val - 1) << bits; 

val -= 1 << bits 

AR 동등하지 않습니다.

바이너리 문자열은 27 자리 길이이므로 문제의 원인 일 가능성이 큽니다.


보다 일반적으로 두 언어는 용어 번호의 정의가 매우 다릅니다.

파이썬은 arbitrary precision integers입니다.

정수는 무제한입니다.

대조적으로 JavaScript는 IEEE 64b doubles pretending to be integers이고 비트 연산자는 truncate their operands to 32 bits입니다.

숫자는 Java의 double 및 Double과 비슷한 64 비트 부동 소수점입니다. 정수 유형이 없습니다. 두 정수 사이의 나눗셈은 분수 결과를 생성 할 수 있습니다.

즉, 최대 52 bits of precision을 저장할 수 있으며 최상위 비트가 2 ** 52보다 큰 경우 하위 비트가 잘립니다. 때문에 자바 스크립트, 대형 진수의 최하위 비트의 부동 소수점 자연의


은 반올림 될 수 있으며 가장 중요한 비트 (<<)에 의해 발생 될 수 있습니다.

+0

감사 Mike (및 Carl).어떤 점에서 유죄 선을 엉망으로 만들었지 만, 그것을 고쳐야 만 javascript 버전이 작동하는 것 같습니다. 나는 마이크의 대답을 받아 들였다. 왜냐하면 중요한 정보를 제공하기 때문이다. 너희 둘 다 챔피언이야! – RoyHB

1

왜이 행이 일치하지 않습니까?

파이썬 :

val -= 1 << bits 

JS :

val -= (val - 1) << bits; 
관련 문제