Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

Lua . में 32 बिट बिटवाइज़ ऑपरेशंस का उपयोग करके हस्ताक्षरित 64 बिट संख्या की तुलना करना

मैं एक विधि के साथ आया जो ऐसा लगता है कि यह काम कर रहा है। हालांकि यह थोड़ा बदसूरत है।

पहला कदम शीर्ष 32 बिट्स की तुलना 2 कॉम्प्लिमेंट के रूप में करना है #'sMSB साइन बिट रहता है, इसलिए संख्याएं सही संबंध रखती हैं

-1  —> -1
0 —> 0
9223372036854775807 = 0x7fff ffff ffff ffff -> 0x7ffff ffff = 2147483647

इसलिए MSB के कार्यों से परिणाम लौटाना जब तक कि वे समान न हों, तब LSB की जाँच करने की आवश्यकता है।

कुछ पैटर्न स्थापित करने के लिए मेरे पास कुछ मामले हैं:

-1 = 0xffff ffff ffff ffff
-2 = 0xffff ffff ffff fffe
32 bit is:
-1 -> 0xffff ffff = -1
-2 -> 0xffff fffe = -2
-1 > -2 would be like -1 > -2 : GOOD

और

8589934591 = 0x0000 0001 ffff ffff
8589934590 = 0x0000 0001 ffff fffe
32 bit is:
8589934591 -> ffff ffff = -1
8589934590 -> ffff fffe = -2
8589934591 > 8589934590 would be -1 > -2 : GOOD

MSB पर साइन बिट कोई फर्क नहीं पड़ता b/c ऋणात्मक संख्याओं का आपस में वही संबंध होता है जो धनात्मक संख्याओं का होता है। जैसे साइन बिट की परवाह किए बिना, 0xff . के lsb मान> 0xfe , हमेशा।

क्या होगा अगर निचले 32 बिट्स पर MSB अलग है?

0xff7f ffff 7fff ffff = -36,028,799,166,447,617
0xff7f ffff ffff ffff = -36,028,797,018,963,969
32 bit is:
-..799.. -> 0x7fff ffff = 2147483647
-..797.. -> 0xffff ffff = -1
-..799.. < -..797.. would be 2147483647 < -1 : BAD!

इसलिए हमें निचले 32 बिट्स पर साइन बिट को अनदेखा करने की आवश्यकता है। और चूंकि साइन की परवाह किए बिना एलएसबी के लिए संबंध समान हैं, सभी मामलों के लिए केवल सबसे कम 32 बिट्स अहस्ताक्षरित कार्यों का उपयोग करना।

इसका मतलब है कि मैं एमएसबी के लिए हस्ताक्षरित और एलएसबी के लिए अहस्ताक्षरित चाहता हूं - इसलिए I4 का पीछा कर रहा हूं करने के लिए i4 एलएसबी के लिए। साथ ही बड़े एंडियन को आधिकारिक बनाना और struct.unpack कॉल पर '>' का उपयोग करना:

-- ...
local comp_int64s = function (as0, au1, bs0, bu1)
    if as0 > bs0 then
        return 1
    elseif as0 < bs0 then
        return -1
    else
        -- msb's equal comparing lsbs - these are unsigned
        if au1 > bu1 then
            return 1
        elseif au1 < bu1 then
            return -1
        else
            return 0
        end
    end
end
local l, as0, au1, bs0, bu1
as0, l = bit.tobit(struct.unpack(">i4", ARGV[1]))
au1, l = bit.tobit(struct.unpack(">I4", ARGV[1], 5))
bs0, l = bit.tobit(struct.unpack(">i4", blob))
bu1, l = bit.tobit(struct.unpack(">I4", blob, 5))
print("Cmp result", comp_int64s(as0, au1, bs0, bu1))


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नोडज और रेडिस के साथ सदस्यता प्रकाशित करें (नोड_रेडिस)

  2. स्प्रिंग-डेटा-रेडिस रेडिस टेम्पलेट अपवाद

  3. एक्सप्रेस Node.JS - रेडिस कॉलबैक प्राप्त करना, वादों को क्रियान्वित करना

  4. विंडोज़ होस्ट से डॉकराइज़्ड रेडिस एक्सेस करें

  5. क्या नीला मोंगोडब और रेडिस जैसी चीजों का समर्थन करता है?