2013-01-20 18 views
5

तो, PHP में हस्ताक्षर किए गए (>>>) हस्ताक्षरित दाएं स्थानांतरित करने के लिए मेरी विधि का उपयोग करते समय, परिणाम गलत है जब संख्या नकारात्मक होती है।PHP बिना हस्ताक्षर किए गए दाएं शिफ्ट -

पीएचपी आवेदन परिणाम:

INPUT: 10 >>> 3 
INPUT: -10 >>> 3 
OUTPUT: 1 
OUTPUT: 2684354558 

जावा आवेदन के परिणाम:

INPUT: 10 >>> 3 
INPUT: -10 >>> 3 
OUTPUT: 1 
OUTPUT: 536870910 

(शीर्ष परिणाम सही और जावा द्वारा उत्पन्न और फिर नीचे परिणाम गलत और PHP के द्वारा उत्पन्न कर रहे हैं)

यह तब होता है जब PHP में संख्या नकारात्मक होती है जो विफल हो जाती है।

बदलाव उन अनुप्रयोगों में इस्तेमाल किया जा रहा है:

करें यदि आप कर सकते हैं मदद! PHP में स्थानांतरण के लिए

विधि:

function urshift($x, $n){ 
$mask = 0x40000000; 
if ($x < 0){ 
    $x &= 0x7FFFFFFF; 
    $mask = $mask >> ($n-1); 
    $ret = ($x >> $n) | $mask; 
    $ret = str_pad(decbin($ret), 32, '0', STR_PAD_LEFT); 
    $ret[0] = '1'; 
    $ret = bindec($ret); 
} else { 
     $ret = (int)$x >> (int)$n; 
} 
return $ret; 
+0

ठीक है, यह स्पष्ट नहीं है कि आपके परिणाम आपके कोड से कैसे मेल खाते हैं। क्या आप एक [न्यूनतम टेस्ट-केस] (http://sscce.org) बना सकते हैं जो स्पष्ट रूप से दर्शाता है कि इनपुट और आउटपुट का उपयोग कैसे किया जाता है? –

+0

मैंने इसे ठीक किया है, इसलिए यह स्पष्ट है कि वह इनपुट और आउटपुट क्या है। –

उत्तर

6

यह uRShift कम है, 32- और 64-बिट पीएचपी साथ सही ढंग से काम करता है और जो जावा के रूप में एक ही आकार ints है 32-बिट पीएचपी पर जावा संस्करण के रूप में एक ही परिणाम देता है;

function uRShift($a, $b) 
{ 
    if($b == 0) return $a; 
    return ($a >> $b) & ~(1<<(8*PHP_INT_SIZE-1)>>($b-1)); 
} 

> uRShift(-10,3) 
536870910 

> uRShift(10,3) 
1 
+0

निम्नलिखित उदाहरण को स्थानांतरित करना काम नहीं कर रहा है: -672461345 >>> 25 जेएस के अनुसार यह 107 होना चाहिए, हालांकि यह 54 9 755813867 लौटाता है। मैंने आपके कोड की खोज की है और इसे दो ओपन सोर्स प्रोजेक्ट्स में पाया है, और मैं इसे इस्तेमाल करने वाला हूं, इसलिए चीजों को साफ़ करने के लिए यह अच्छा होगा। और देखें: http://stackoverflow.com/questions/24659911/unsigned-right-shift-function-not-working-for-negative-input – frzsombor

+0

सावधानी बरतें! यदि आप एक PHP फ़ंक्शन की तलाश में हैं जो जावास्क्रिप्ट के समान आउटपुट देता है, तो मुझे अंत में एक समाधान समाधान मिला! अधिक जानकारी, लाइव डेमो, परीक्षण, उदाहरण: http://stackoverflow.com/a/43359819/2953830 – frzsombor

2

इस समारोह आज़मा सकते हैं।

function uRShift($a, $b) 
{ 
    $z = hexdec(80000000); 
    if ($z & $a) 
    { 
     $a = ($a >> 1); 
     $a &= (~$z); 
     $a |= 0x40000000; 
     $a = ($a >> ($b - 1)); 
    } else { 
     $a = ($a >> $b); 
    } 
    return $a; 
} 
संबंधित मुद्दे