2013-04-17 1 views
1

저는 약간 혼란 스럽습니다. 두 개의 32 비트 정수, 가장 중요한 비트 중 하나가 & 다른 하나는 최소입니다. PHP에서이 둘의 십진수를 어떻게 찾을 수 있습니까?PHP에서 최상위 비트와 최하위 비트의 십진수를 계산하십시오.

업데이트 : 나는 @bwoebi에서 제안을 시도하고 약간 수정했습니다. 여기 코드는 다음과 같습니다

$value=get64($msb, $lsb); 

function get64($msb, $lsb) { 
    $count = count($lsb); 
    for($i=0; $i < $count; $i++) { 
     $value[$i] = bcadd(bcmul($msb[$i], bcpow(2, 32)), $lsb[$i] > 0?$lsb[$i]:bcadd(bcsub(bcpow(2, 32), $lsb[$i]), 2 << 30)); // $a most significant bits, $b least significant bits 
    } 
} 

출력 :

msb=Array ([0] => INTEGER: 0 [1] => INTEGER: 0) 
lsb=Array ([0] => INTEGER: 143 [1] => INTEGER: 0) 
value=Array ([0] => 2147483648 [1] => 2147483648) 

출력이 제대로 보이지 않습니다는 ... 내가 값으로 143을 예상했을 것 [0]. 어떤 입력?

+0

그래서 저는 여러분이 32 비트 PHP를 실행하고 있다고 생각합니다. 64 비트 PHP를 사용하고 있다면이 방법이 더 쉬울 것입니다. 서명 된 또는 서명되지 않은 정수는 없지만? –

+0

@MarkBaker PHP는 정수 만 서명했습니다 ... – bwoebi

+0

@bwoebi - OP의 정수가 부호가없는 경우에 차이가있는 이유는 무엇입니까? –

답변

1
bcadd(bcmul($a, bcpow(2, 32)), $b >= 0?$b:bcsub(bcpow(2, 32), $b)); // $a most significant bits, $b least significant bits 

이 작업을 수행해야합니다. 32 비트 시스템에서 일반 연산자로 작업 할 때 부정확 한 점으로 bc 라이브러리를 사용하고 있습니다 (float으로 변환 됨).

+0

다음 값으로 코드를 보았습니다 :'a = 1 b = 2147483647 sum = 6442450943' 그게 옳은가요? – PLui

+0

@PLui 맞습니다 ... 1 * 2^32 + 2^31-1 = 3 * 2^31-1 = 6442450943 (ps 또한 음수 인 $ b를 부호없는 값으로 변환합니다 : b = -2147483648 (및 $ a = 0) => 2^32) – bwoebi

+0

도움을 많이 주셔서 감사합니다! – PLui