2013-10-31 3 views
4

나는 펄 포트에 PHP 알고리즘을 시도하고 있지만, 내가 익숙하지있어 하나의 비트 연산자 투쟁 ...펄 단항 ~ 준다 예상 된 결과

때문에 PHP 코드는 다음과 같습니다 :

... 
$var = '348492634'; 
print ~$var; 
... 

:

... 
$var = '348492634'; 
print ~$var; 
... 

결과 : 펄에서 똑같은 일을하고 -348492635

결과 : 18446744073361058981

나는 CPU의 아키텍처에 따라 정수 크기에 대해 많이 읽었지만 실제 해결책을 찾지 못했습니다. 어쩌면 나는 단지 perl에서 잘못된 함수를 사용하고있다. ...

PHP 스크립트에서와 같은 결과를 얻으려면 논리가 필요하다.

+0

단항'~'정수가 아닌 코드로 16 진수 문자열 입력을 강제 변환 의견이 제안합니다. – mob

+0

@mob'~'도 문자열에서 작동합니다 :' "\ xCE \ xCD \ xCC"eq ~ "123"'. EggL의 출력은 그가 보여주는 코드에 의해 생성되지 않습니다. 어딘가에 다른 숫자가 있습니다. – amon

+0

@amon PHP 버전에 따라 다를 수 있습니다. http://www.php.net/manual/en/language.operators.bitwise.php에있는 주석을보고 모든 사람들이'~'연산자를 다시 구현하려고하는 것을 보는 것이 재미 있습니다. – mob

답변

2

이 설정에 그렇게 보인다 사전에

덕분에, PHP의의 int는 펄의 int는 64 비트 부호있는 동안 32 비트 서명입니다.

이것은 주어진 시스템에서 필요한 작업을 수행 할 수 있지만 perl의 다른 설치에서 사용하면 동일하게 작동한다는 보장은 없습니다.

$var = '348492634'; #hex! 
print ~($var - 2**32) - 2**32; 
0

빠른 더러운 변환은 다음과 같습니다

print -($var+1); # like ~$var in PHP 

펄은 64 비트 정수를 사용하는 경우, 이것은 단지 값 인, $var=-18446744073709551616 (0x8000000000000000)에 대한 실패는 않을 것 어쨌든 32 비트 PHP에서 사용하십시오.

1

다음은 (당신이 가진 않았다) 모두 (당신이 주장하는) $var='348492634'$var=348492634 위해 할이 :

unpack('l', ~pack('l', $var))