में पीओपीसीएनटी डेल्फी एक्सई या एक्सई 2 के तहत, बहुत तेज़ इंटेल पीओपीसीएनटी निर्देश का उपयोग करके 16/32/64 बिट शब्द के भीतर 1-बिट्स की गिनती कैसे कार्यान्वित कर सकता हूं? क्या इस पुस्तकालय की नियमितता इस निर्देश के लिए सीधे पहुंच प्रदान करती है? क्या कोई व्यक्ति इसका उपयोग दिखाते हुए डेमो एएसएम अनुभाग लिख सकता है? और आखिरकार, 64 बिट डेल्फी के लिए विकल्प क्या हैं (कोई एएसएम उपलब्ध नहीं है)? अग्रिम धन्यवाद टीडेल्फी एक्सई/एक्सई 2 64 बिट
उत्तर
रॉब केनेडी के रूप में, यहां आपके 32 बिट और 64 बिट डेल्फी आईडीई के लिए कार्य हैं।
function GetBitCount(num: integer): integer;
asm
POPCNT eax, num
end;
function GetBitCount(num: Int64): integer;
asm
POPCNT rax, num
end;
संपादित करें: यह 32bit और 64bit डेल्फी संगत संस्करण
{$IF CompilerVersion < 23} //pre-XE2
NativeInt = integer;
{$IFEND}
function GetBitCount(num: NativeInt): integer;
asm
{$IFNDEF CPUX64}
POPCNT eax, num
{$ELSE CPUX64}
POPCNT rax, num
{$ENDIF CPUX64}
end;
वह आखिरी वाला डोडी दिखता है, शायद 64-बिट एक में 32-बिट मान और स्टोर पर काम करेगा? या तो 32-बिट ऊपरी शून्य या इसे int64 के रूप में घोषित करें? –
@ मार्को वैन डी वोउर्ट धन्यवाद, हाँ यह डिफ़ॉल्ट रूप से 32 बिट है, लेकिन आप num को 'मूल' या 'Int64' या' UInt64' के रूप में घोषित कर सकते हैं बल्कि यह सभी थैम के साथ काम करता है। Int64 के लिए सही! –
यदि आप एक परिवर्तनीय int आकार का उपयोग करते हैं, तो आपको popcnt लाइन में रजिस्टर को ifdef करने की भी आवश्यकता है। –
एएसएम के साथ-साथ 64 बिट डेल्फी में avaible है है। – Giel
मुझे लगता है कि यह एक एएसएम ब्लॉक के अंदर 'popcnt eax, eax' या' popcnt rax, rcx' लिखना जितना आसान नहीं है, है ना? –
थोड़ा ऑफ-विषय: http://www.strchr.com/crc32_popcnt में पॉपकंट कार्यान्वयन की तुलना तालिका है, जहां एक एसएसएसई 3 (निबल टेबल लुकअप के लिए 'pshufb') वास्तव में कुछ सिस्टम पर' popcnt' धड़कता है। केवल कुछ ही%, सभी सीपीयू पर जरूरी नहीं है, और केवल तभी फायदेमंद है यदि आप डेटा की बड़ी (100+ बाइट्स) मात्रा के लिए ऑपरेशन करते हैं। _ बहुत तेज़_ सापेक्ष है। –