क्या मेरा OS 32-बिट या 64-बिट है?


53

यह अब बहुत महत्वपूर्ण नहीं है, लेकिन कभी-कभी किसी को जानने की आवश्यकता होती है।

यहां एक साधारण गोल्फ है: कोई उपयोगकर्ता इनपुट नहीं लेना, मुझे बताएं कि क्या कंप्यूटर जिस पर कोड चलाया जाता है वह 64-बिट ऑपरेटिंग सिस्टम, या 32-बिट ऑपरेटिंग सिस्टम पर है!

यदि कोड 32-बिट ऑपरेटिंग सिस्टम पर चलाया जाता है, तो "32" प्रिंट करें, यदि कोड 64 बिट ऑपरेटिंग सिस्टम पर चलाया जाता है, तो आउटपुट "64"। महत्वपूर्ण: अल्फ़ान्यूमेरिक वर्णों के किसी अन्य गैर-रिक्त स्ट्रिंग को मुद्रित करें यदि यह 32 या 64 बिट नहीं है।

कृपया ध्यान दें कि 64 बिट ऑपरेटिंग सिस्टम वाले कंप्यूटर पर चलने वाला 32 बिट प्रोग्राम "64" आउटपुट होना चाहिए। आप यह मान सकते हैं कि उपयोगकर्ता जब भी संभव हो 64 बिट सॉफ्टवेयर का उपयोग करेंगे।

प्रवेश के लिए योग्य होने के लिए, आपका कोड विंडोज 4.10 या नए Microsoft समर्थित विंडोज सिस्टम पर चलने में सक्षम होना चाहिए , और आपके चयन के लिनक्स का कम से कम एक स्वाद (ताकि जब तक कि स्वाद गंभीर हो)। संगतता मोड इंस्टॉल किए जा सकते हैं, इसलिए जब तक कि प्रोग्राम अभी भी सही मान लौटाता है।

सामान्य नियम लागू होते हैं।

नोट: यदि आपका उत्तर केवल ३२ या ६४ को प्रिंट करने के लिए है, लेकिन सर्वोच्च मामले में नहीं है, तो मैं इसे स्वीकार करूंगा, लेकिन यह एक प्रतिस्पर्धी उत्तर नहीं है।

मैं कोशिश करूँगा और बाद में अलग-अलग OSes पर इन कोड को चलाने के कुछ परिणाम पोस्ट करूँगा!


5
इसलिए "कृपया ध्यान दें कि 64 बिट ऑपरेटिंग सिस्टम वाले कंप्यूटर पर 32 बिट प्रोग्राम" 64 "आउटपुट होना चाहिए। आप मान सकते हैं कि उपयोगकर्ता जब भी संभव हो 64 बिट सॉफ्टवेयर का उपयोग करेंगे।" इसका मतलब है कि यदि व्याख्याकार / संकलक आदि 32 बिट और 64 बिट दोनों में उपलब्ध है, तो 32 बिट ओएस हमेशा इंटरप्रेटर / आदि के 32 बिट संस्करण को चलाएगा, और 64 बिट ओएस हमेशा 64 बिट इंटरप्रेटर को चलाएगा। /आदि। तो कार्यक्रम 32 या 64, और ओएस 32 या 64 किया जा रहा जा रहा है के बीच अंतर के बारे में चिंता, मूल रूप से है केवल केवल 32 बिट कार्यान्वयन के साथ भाषाओं के लिए एक समस्या है। सही?
लिंडन व्हाइट

2
यहां कई समाधान 64-बिट ओएस पर "32" प्रिंट करेंगे यदि प्रोग्राम को संकलित करने के लिए 32-बिट कंपाइलर का उपयोग किया गया था। यह ठीक है?
मार्टिन रोसेनॉ

15
दुनिया में "विंडोज 4.10" क्या है? क्या इसका मतलब विंडोज 98 है? या इसका मतलब विंडोज एनटी 4 है? आप इससे "नया" क्या मानते हैं? यह एक असाधारण रूप से खराब सोची-समझी चुनौती लगती है ।
कोड़ी ग्रे

13
कोई "आधिकारिक विंडोज़ कल्पना" नहीं है, और कोई भी विंडोज़ 98 को "विंडोज 4.10" होने के रूप में संदर्भित नहीं करता है। आप सचमुच पहले हैं। तो शायद संस्करण संख्याओं का उपयोग करके शांत या आधिकारिक ध्वनि करने की कोशिश करने के बजाय, आपको बस वास्तविक उत्पाद नाम का उपयोग करना चाहिए । वैसे, विंडोज 9x 64-बिट बिल्ड में कभी भी उपलब्ध नहीं था, इसलिए क्या वास्तव में मेरे लिए एक प्रविष्टि प्रस्तुत करना वैध है जो केवल विंडोज 98 पर चलता है और "32" देता है? बहुत अनुचित / महत्वहीन / अविरल लगता है, लेकिन तकनीकी रूप से आपके नियमों की अनुमति होगी।
कोडी ग्रे

3
आपने अभी भी विंडोज संस्करण के बारे में सवाल का जवाब नहीं दिया है। क्या विंडोज 4.10 पर चलने में सक्षम होना चाहिए या विंडोज 4.10 पर नए अर्थ और सभी नए संस्करण या किसी एकल विंडोज संस्करण, 4.10 या नए पर चलना चाहिए ?
डेनिस

जवाबों:


44

x86 असेंबली (पॉलीग्लॉट), 13 बाइट्स

बाईटकोड:

31 c0 b4 80 48 70 05 04 40 83 e0 60 c3

एक फ़ंक्शन को परिभाषित करता है जो 32 लौटाता है यदि 32-बिट के रूप में व्याख्या की जाती है, 64 यदि 64-बिट, और 32767 यदि 16-बिट।

मैं एक पॉलीग्लॉट बनाना चाहता था जो विंडोज और लिनक्स पर चलता था, लेकिन यह मेरे विचार से बहुत कठिन है। जैसा कि मुझे यकीन है कि बिना लिंक किए बिना गैर-16-बिट विंडोज पर एक मूल्य प्रिंट करने का कोई तरीका नहीं है।

व्याख्या

यह कोड उस आर्किटेक्चर को निर्धारित करने के लिए दो का उपयोग करता है जिसे वह चला रहा है। पहला निर्देश 0x48 है - 16 और 32 बिट्स पर, यह है dec %eax, लेकिन 64 बिट्स पर, यह एक अनुदेश-आकार उपसर्ग है। दूसरा वर्णन समान निर्देश है, हालांकि, जब हम इसे 0x8000 मान पर निष्पादित करते हैं, तो सबसे महत्वपूर्ण बिट केवल तभी फ़्लिप किया जाता है यदि रजिस्टर का आकार 16 बिट्स हो, ओवरफ़्लो ध्वज सेट करना और हमें उपयोग करने देना jo

16 बिट्स में, इस कोड की व्याख्या निम्न के रूप में की जाती है:

   0:   31 c0                   xor    %ax,%ax    /* 0x0000 */
   2:   b4 80                   mov    $0x80,%ah  /* 0x8000 */
   4:   48                      dec    %ax        /* 0x7fff */
   5:   70 05                   jo c              /* taken  */
   7:   04 40                   add    $0x40,%al
   9:   83 e0 60                and    $0x60,%ax
   c:   c3                      ret               /* 0x7fff */

32 बिट्स में, इस कोड की व्याख्या निम्न के रूप में की जाती है:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48                      dec    %eax        /* 0x00007fff */
   5:   70 05                   jo c               /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00007f3f */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000020 */
   c:   c3                      ret

64 बिट्स में, इस कोड की व्याख्या निम्न के रूप में की जाती है:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48 70 05                rex.W jo c         /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00008040 */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000040 */
   c:   c3                      ret

यह वास्तव में संभवतया मुख्य, बहुत अच्छा
tuskiomi

1
एक बहुत साफ विचार, लेकिन जैसा कि लागू किया गया है, यह गलत मान लौटाएगा यदि 32-बिट बाइनरी के रूप में इकट्ठा किया जाता है और 64-बिट ऑपरेटिंग सिस्टम पर चलता है।
कोडी ग्रे

@CodyGray नियमों से: आप मान सकते हैं कि उपयोगकर्ता जब भी संभव हो 64 बिट सॉफ्टवेयर का उपयोग करेंगे। मुझे लगता है कि इसका मतलब यह भी है कि कार्यों के लिए हम यह मान सकते हैं कि जब भी संभव हो कॉलर कोड 64 बिट है।
रुस्लान

आह, मुझे लगता है कि यह एक उचित व्याख्या है, @ रुस्लान। और मुझे लगता है कि आपने पहले से ही मेरे मन में जो उत्तर पोस्ट किया था , क्या वह इस मुद्दे के लिए नहीं था। :-) आपको मेरा उत्थान मिल गया है।
कोड़ी ग्रे

बाइट 16-बिट मोड में 48प्रदर्शित करता dec %eaxहै?
फुलेव

48

x86 मशीन कोड, 12 बाइट्स

8c c8 83 f8 23 b0 20 75 02 00 c0 c3

Ungolfed:

getKernelBitness:
    mov eax,cs
    cmp eax,0x23 ; 32 bit process on 64 bit kernel has this selector in CS
    mov al,32
    jne kernelIs32Bit
    add al,al    ; return value in eax
kernelIs32Bit:
    ret

यह फ़ंक्शन लिनक्स में तब काम करता है जब i386 SysV ABI के बाद ELF32 में उपयोग किया जाता है, साथ ही साथ PE32 में विंडोज / वाइन में जब stdcallकॉलिंग कन्वेंशन का उपयोग किया जाता है ।


वास्तव में एक बाइट काउंट को और भी कम कर सकता है यदि किसी अन्य दृष्टिकोण का अनुसरण किया जाए
रुस्लान

एक गैर 32/64 बिट वातावरण में यह सैद्धांतिक रूप से क्या करेगा?
tuskiomi

1
@tuskiomi किसी भी मामले में, इस कोड को अभी भी या तो 32 या 64 16-बिट मोड में इस बाइट क्रम की व्याख्या से स्मृति सहायकों का एक परिवर्तन हो जाएगा का फर्क सिर्फ इतना है वापस आ जाएगी eaxकरने के लिए ax। इसलिए, यदि चयनकर्ता csऐसा करता है 0x23, तो परिणाम 64 होगा, अन्यथा 32.
रुस्लान

हालांकि यह दो विशेष ऑपरेटिंग-सिस्टमों के लिए विशिष्ट है। आप आसानी से cs = 0x23 के साथ 32-बिट सिस्टम लगा सकते हैं। इसके बजाय मेरे 8-बाइट उत्तर को देखें जो सीपीयू को इसके बजाय लक्षित करता है।
23

@peterferrie हाँ, यही कारण है कि मेरे पास एक और जवाब है । लेकिन तुम्हारा यह 2 बाइट्स द्वारा outgolf करता है।
रुस्लान

32

गणितज्ञ, 17 बाइट्स

$SystemWordLength

13
बेशक वहाँ एक बेसिन है! \ s (+1)
tuskiomi

क्या आपको या तो जोड़ना नहीं चाहिए &या यह निर्दिष्ट करना चाहिए कि यह REPL में है?
लीजियनममाल 978

5
@ LegionMammal978 "यदि कोड 32-बिट ऑपरेटिंग सिस्टम पर चलाया जाता है, तो" 32 "प्रिंट करें, यदि कोड 64 बिट ऑपरेटिंग सिस्टम पर चलाया जाता है, तो आउटपुट" 64 "। अल्फ़ान्यूमेरिक वर्णों के किसी भी (अन्य) गैर-रिक्त स्ट्रिंग को प्रिंट करें। अगर यह नहीं है। " नहीं "एक फ़ंक्शन प्रदान करें, जो जब चलता है, तो यह करता है"; बस "यह करो"।
पैट्रिक स्टीवंस

17
@PatrickStevens: यदि प्रश्न निर्दिष्ट नहीं करता है कि सबमिशन किस रूप में लेना चाहिए, तो यह एक प्रोग्राम या फ़ंक्शन है, लेकिन एक स्निपेट नहीं, डिफ़ॉल्ट रूप से

3
@ ais523 मैं तर्क दूंगा कि कार्यक्रमों, कार्यों और स्निपेट्स के बीच गणितज्ञ में कोई भेद नहीं है। सब कुछ सिर्फ एक अभिव्यक्ति है।
नगीनिस

21

बूट लोडर

क्या आप जानते हैं कि GRUB और IPXE दोनों में ट्यूरिंग की पूरी प्रोग्रामिंग लैंग्वेज रन-टाइम पर उपलब्ध हैं? बूट लोडर का Syslinux परिवार ऐसा नहीं करता है लेकिन वे ऐसा कर सकते हैं।

IPXE, 36 बाइट्स

#!ipxe
cpuid --ext 29 && echo 64 || echo 32

यदि स्क्रिप्ट को दूरस्थ रूप से चलाया जाता है, लेकिन कमांड लाइन पर सीधे टाइप किया गया हो तो पहली पंक्ति की आवश्यकता नहीं है।

GRUB, 42 बाइट्स

if cpuid -l ; then
echo 64
else
echo 32
fi

सिस्लिनक्स, 186 बाइट्स

यह तीन फाइलें लेता है पहला है syslinux.cfg (या आइसोलिन-क्यूसीएफजी, आदि)।

label a
  kernel ifcpu64.c32
  append s -- t

label s
  kernel menu.c32
  append s.cfg

label t
  kernel menu.c32
  append t.cfg

default a
prompt 0
timeout 0

और t.cfg

menu title 32

ans s.cfg

menu title 64

इसके लिए एक कठिन हिस्सा यह है कि syslinux में कोई सरल पाठ प्रदर्शन क्षमता नहीं है, इसलिए मेनू का दुरुपयोग किया जाता है।


मुझे यकीन नहीं है कि आप एक बूट लोडर के साथ ओएस रिज़ॉल्यूशन बता सकते हैं, लेकिन मुझे यह विचार पसंद है
tuskiomi

यह सीपीयू की जांच करता है और इसका उपयोग सही ऑपरेटिंग सिस्टम का चयन करने के लिए किया जाता है। यह मूल रूप से मेरी अनबूट परियोजना से कोडित गोल्फ है।
hildred

2
तो यह आर्किटेक्चर के आधार पर ओएस को बदलता है। खुल के सोचो। मुझे पसंद है।
tuskiomi

क्या है बायटेकाउंट?
रिस्टोरियोन

1
@ निस्संदेह मेरा मानना ​​है कि अगर आप ## iPXE, 36 bytesइसके बजाय अधिक पठनीय होंगे### ipxe 36
NieDzejkob

21

जूलिया 14 13 बाइट्स

n->8sizeof(1)

के बारे में बताएं:

  • एनोन फ़ंक्शन, कुछ भी (सहित nothing) एक पूर्णांक 32, या 64 लौटा रहा है
  • पूर्णांक शाब्दिक प्रकार के होते हैं Intजो 32 बिट या 64 बिट पर निर्भर करता है, या तो एक Int32या एक Int64( 1कोई भी अंक हो सकता है)
  • फंक्शन कॉल से पहले एक नंबर रखने पर एक ज्यूकसपुलिशन गुणा होता है
  • यह मूल रूप से कोडSys.WORD_SIZE का एक छोटा संस्करण है , जिसका उपयोग rahnema1 के उत्तर में किया जाता है

अन्य मजेदार जवाब है ()->"$(Int)"[4:5], लेकिन मैं उस एक पर नीचे नहीं मिल सकता।


-1 रमन ग्रैफ को धन्यवाद


आप एक डमी तर्क का उपयोग कर सकते हैं: codegolf.meta.stackexchange.com/a/12696/56341
रोमन ग्रैफ

19

जूलिया, 20 17 16 बाइट्स

n->Sys.WORD_SIZE

* धन्यवाद @LyndonWhite ने 3 बाइट्स को बचाया * @ RomanGräf को एक बाइट बचाया

पिछले उत्तर:

()->Sys.WORD_SIZE
print(Sys.WORD_SIZE)

इसे ऑनलाइन आज़माएं!


1
मैं, व्यक्तिगत रूप से, यह एक की तरह!
tuskiomi

2
निम्नलिखित सम्मेलन द्वारा: codegolf.meta.stackexchange.com/q/2419/62131 आप 3 बाइट्स से दाढ़ी बना सकते हैं()->Sys.WORD_SIZE
Lyndon White

1
आप एक डमी तर्क का भी उपयोग कर सकते हैं: codegolf.meta.stackexchange.com/a/12696/56341
रोमन ग्रैफ

14

जावास्क्रिप्ट (Node.js), 24 बाइट्स

_=>process.arch.slice(1)

यह एक समारोह और रिटर्न है '32', '64'या न अगर 'rm'


+1, लेकिन मुझे लगता है कि 64 बिट का आर्क 32bit ओएस चला सकता है
ऑक्टोपस

1
32-बिट विंडोज पर मुझे '32' देता है, इसलिए यह काम करता दिखाई देता है।
केन वाईएन

5
यदि आप REPL का उपयोग कर रहे हैं और osइसके बजाय आप 7 बाइट्स को शेव कर सकते हैं process:os.arch().slice(1)
GilZ

यह OS आर्किटेक्चर को प्रक्रिया की सूचना देता है, वास्तविक OS आर्किटेक्चर को नहीं। तो यह लिनक्स पर काम नहीं करता है। (अपने पसंदीदा सर्च इंजन में "सेटर्च" डालें।)
डेविड श्वार्ट्ज

@DavidSchwartz यह मेरे लिनक्स बॉक्स पर ठीक काम करता है जब तक कि मुझे गलतफहमी न हो, लेकिन PPCG पर हम उपयोगकर्ता को आर्क बदलने के मामले में एक अनमॉडिफाइड वातावरण मान सकते हैं
डाउगोनेट

13

सी, 33 31 29 23 बाइट्स

f(){return sizeof&f*8;}

गोल्फर युक्तियों के लिए टिप्पणीकारों @ceilingcat और @ डेनिस को धन्यवाद!


13
यह भी कहा गया है कि सामान्य कोड गोल्फ नियम लागू होते हैं, और एक समारोह से वापस लौटना I / O के लिए हमारी चूक का हिस्सा है।
डेनिस

11
क्या यह निर्भर नहीं है कि आप 32 या 64 बिट प्रोग्राम के रूप में संकलन करते हैं?
केन वाईएन

4
यह आवश्यकताओं का अनुपालन नहीं करता है। " कृपया ध्यान दें कि 64 बिट ऑपरेटिंग सिस्टम वाले कंप्यूटर पर 32 बिट प्रोग्राम" 64 "आउटपुट होना चाहिए। " यह आपको बताता है कि प्रोग्राम को कैसे संकलित किया गया था, न कि ओएस क्या है।
डेविड श्वार्ट्ज

2
@DavidSchwartz "आप मान सकते हैं कि उपयोगकर्ता जब भी संभव हो 64 बिट सॉफ्टवेयर का उपयोग करेंगे।"
क्लस लिंडबैक

2
यह कहने के लिए क्षमा करें, लेकिन संकलन समय पर आकार का मूल्यांकन किया जाता है। इसलिए यदि आप एक 32 बिट एक्साई को संकलित करते हैं और इसे 64 बिट मशीन पर चलाते हैं, तो यह 32 को आउट कर देगा, जबकि यह 64 ( stackoverflow.com/questions/2615203/… ) को आउटपुट करना चाहिए । हालांकि अच्छा विचार है!
दिनाज

11

पॉवरशेल, 16 बाइट्स

8*[IntPtr]::Size

बिट्स प्राप्त करने के लिए बाइट्स में पॉइंटर आकार को 8 से गुणा करता है।


-1 क्योंकिyour code must be able to run on Windows 4.10 or newer
ub3rst4r 5

11
@ ub3rst4r या नया, नया और नया नहीं । मैं इन उत्तरों का एक अच्छा हिस्सा शर्त लगाने के लिए तैयार हूं, मुश्किल है, सबसे अच्छा, विंडोज के लंबे-असमर्थित संस्करण पर चलने के लिए। सभी OS के 98 लोगों पर परीक्षण करने की अपेक्षा करना भी अनुचित है - इन दिनों वीएम में स्थापित करना आसान नहीं है (मुझे विश्वास करें, मैंने कोशिश की है। केवीएम पर नहीं चलने वाला है, और इसमें VBox प्रदर्शन एडेप्टर के साथ दिलचस्प बातचीत है) । (और न ही यह 64-बिट की अवधारणा भी है ... यह वास्तव में हास्यास्पद आवश्यकता है।)
बॉब

1
@ ub3rst4r मुझे संदेह है कि यहां व्याख्या की गई सभी प्रोग्रामिंग भाषाओं में विंडोज 4.10 पर काम करना लागू है!
मार्टिन रोसेनौ

1
ऐसा लगता है कि यह विफल हो जाता है अगर यह 64-बिट ओएस पर 32-बिट की शक्तियां है।
क्रिस जे

@ChrisJ कम से कम Win10 और Win2012 R2 पर यह x86 PowerShell से उचित परिणाम देता है। लिनक्स पर परीक्षण नहीं किया गया।
बूगा रो

10

पायथन 2, 52, 48, 42 41 बाइट्स

from struct import*;print calcsize("P")*8

पूरी तरह से धन्यवाद!


ज़ूम! एक मिनट के भीतर लाइन के पार।
tuskiomi

मैं इसे घर पर परीक्षण करने के लिए बंद करने जा रहा हूँ, लेकिन मुझे यकीन नहीं है कि यह "32" और "64" प्रिंट करता है, लेकिन अन्य मामलों में मुझे विश्वास है।
tuskiomi

@tuskiomi, यह "32 बिट" या "64 बिट" प्रिंट करता है
डैनियल

1
from struct import*;print calcsize("P")*8छोटा है।
पूरी तरह से

12
यदि आप 64-बिट OS में 32-बिट पायथन पर इसे चलाते हैं, तो मुझे लगता है कि यह आपके लिए झूठ होगा। अधिकांश अन्य उत्तर भी वैसे भी संवेदनशील लगते हैं ...
निक टी

10

जावा 8, 45 बाइट्स

()->System.getProperty("sun.arch.data.model")

@ डोप्प्प व्हाट (s) उनका मतलब है कि यह एक स्निपेट है, न कि कोई प्रोग्राम या फंक्शन। जावा 8 में, यह काम करना चाहिए:n=>System.getProperty("os.arch")
NoOneIsHere

@ नोनीनेशेरे, ओह धन्यवाद, जो मेरे सिर पर चला गया
डैनियल

2
"यदि कोड 32-बिट ऑपरेटिंग सिस्टम पर चलाया गया है, तो" 32 "प्रिंट करें, यदि कोड 64 बिट ऑपरेटिंग सिस्टम पर चलता है, तो आउटपुट" 64 "। यदि यह है तो अल्फ़ान्यूमेरिक वर्णों के किसी भी (अन्य) गैर-रिक्त स्ट्रिंग को प्रिंट करें। न। "। ऐसा वह बिल्कुल नहीं करता ...
ओलिवियर ग्रेजायर

4
क्या आप विंडोज 98 (v4.10) के लिए जावा 8 प्राप्त कर सकते हैं?
TessellatingHeckler

4
@TessellatingHeckler Java 8 के लिए "i586" (जो भी मतलब हो) की आवश्यकता होती है। प्रविष्टि कहती है: "आपका कोड विंडोज 4.10 या नए पर चलने में सक्षम होना चाहिए ", "आपका कोड विंडोज 4.10 और नए पर चलने में सक्षम होना चाहिए "। यह एक नए विंडोज पर चलता है ।
ओलिवियर ग्रेजायर


8

विंडोज सीएमडी, 56 52 बाइट्स (धन्यवाद बॉब!)

if EXIST "%ProgramFiles(x86)%" (echo 64)else echo 32

फिर भी आश्चर्यजनक रूप से लंबा - अब तक का सबसे लंबा!


1
वास्तव में, %windir%\SysWOW64और भी छोटा है, मुझे लगता है ...
बॉब

7
" विंडोज 4.10 या नए पर चलने में सक्षम होना चाहिए, और अपने चयन के लिनक्स के कम से कम एक स्वाद " - इसके लिए लिनक्स का कौन सा स्वाद?
TessellatingHeckler

1
@TessellatingHeckler यदि आप वाइन स्थापित करते हैं ...?
केन वाईएन

1
आशुलिपि का उपयोग करने के बारे में क्या? if EXIST "c:\Progra~3" (echo 64)else echo 32डिफ़ॉल्ट रूप से आपके पास ProgramDataऔर Program Filesइसलिए यदि कोई तीसरा मौजूद है, तो हमें
मैरी

3
8-बिट OS के लिए यह क्या प्रिंट करेगा?
tuskiomi

7

C, Win32 API, 103 183 बाइट्स

#include <windows.h>
typedef int(WINAPI*F)(HANDLE,int*);b;main(){F f=GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");return(f!=0&&f(GetCurrentProcess(),&b)&&!b)?32:64;}

दरअसल यहां 2 से अधिक मामले हैं। आइए उनकी जांच करते हैं

  • सबसे आसान: IsWow64Processमौजूद नहीं है: हम 32 बिट ओएस पर हैं

अगले दो मामलों के लिए हमें यह ज्ञान होना चाहिए कि हमारा बाइनरी एक 32 बिट निष्पादन योग्य होगा। और बाहर के पैरामीटर में क्या होगा, इसका यह विवरणIsWow64Process

यदि मान WOW64 के तहत चल रहा है, तो TRUE पर सेट होने वाले मान का सूचक। यदि प्रक्रिया 32-बिट विंडोज के तहत चल रही है, तो मान FALSE पर सेट है। यदि प्रक्रिया 64-बिट विंडोज के तहत चलने वाला 64-बिट अनुप्रयोग है, तो मान भी FALSE पर सेट है।

दो अतिरिक्त मामलों के साथ हमें छोड़ देता है:

  • IsWow64Process मौजूद है, और TRUE -> पैदावार देता है - हम 64 बिट मशीन पर हैं
  • IsWow64Process मौजूद है, और पैदावार FALSE -> हम एक 32 बिट मशीन पर हैं

हम उस हिस्से के बारे में चिंता नहीं करते हैं जहाँ 64-बिट विंडोज पर 64-बिट अनुप्रयोग FALSE होता है। जैसे हम जानते हैं कि हमारा आवेदन 32-बिट है

ओह, और एक अतिरिक्त मामला है जो इस चुनौती से आच्छादित नहीं है और यह दुर्लभ होना चाहिए:

  • IsWow64Process मौजूद है, लेकिन यह विफल रहता है: हम 32-बिट मशीन के लिए डिफ़ॉल्ट हैं।

इसमें अधिकांश Windows NT ऑपरेटिंग सिस्टम शामिल होने चाहिए। केवल Win10 64-Bit, Win 7 64-Bit, Win 8.1 32-Bit और WinXP SP1 32-Bit पर परीक्षण किया है


मूल उत्तर:

#include<windows.h>
main(){return GetProcAddress(GetModuleHandle("Kernel32"),"IsWow64Process")?64:32;}

यह सुनिश्चित करने के लिए कि हमें केवल 2 मामलों में अंतर करने की आवश्यकता है

  • IsWow64Process kernel32.dll => में मौजूद नहीं है, हम 32 बिट मशीन पर हैं।

  • IsWow64Process मौजूद है => हम 64 बिट मशीन पर हैं।

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

अधिकांश उत्तरों के विपरीत, यह उस मशीन पर संकलित होने वाले द्विआधारी पर निर्भर नहीं करता है जिस पर इसे निष्पादित किया जाता है।

यदि मुझे एक छोटा कार्य पता था जो केवल 64 बिट पर मौजूद है और 32 बिट मशीन नहीं है, तो मैं उत्तर को छोटा कर सकता हूं।


2
.dllमॉड्यूल नाम स्ट्रिंग से ड्रॉप करें । न केवल यह गोल्फिंग के लिए अच्छा है, बल्कि यह वास्तव में सामान्य उपयोग में भी बेहतर अभ्यास है। इसके अलावा, गोल्फ उद्देश्यों के लिए, आप बाद में जगह छोड़ सकते हैं #include
कोड़ी ग्रे

धन्यवाद, मैं वास्तव में एक मॉड्यूल की तलाश में पूरी चीज को कम करना चाहता था जो कि 64 बिट पर पाया जा सकता है लेकिन 32 बिट पर नहीं। मैं अब भी देख रहा हूँ। अफसोस की बात है (इस उद्देश्य के लिए) कोई मॉड्यूल नहीं है जिसे वाह कहा जाता है।
MrPaulch

वहाँ वास्तव में एक है wow64.dllऔर Wow64Win.dllहै, लेकिन मैं कॉल करने की कोशिश कभी नहीं किया है GetModuleHandleउन के साथ। हालांकि, समस्या यह है कि वे केवल 64-बिट मशीन पर चलने वाली 32-बिट प्रक्रिया के लिए लोड किए जाएंगे, 64-बिट मशीन पर चलने वाली 64-बिट प्रक्रिया के लिए नहीं
कोड़ी ग्रे

मेरे पास है। वे 64 बिट मशीन पर भी 0 लौटाते हैं। वास्तव में समझ में आता है। वे सीधे से जुड़े होने के लिए मौजूद नहीं हैं। सिस्टम रनटाइम के दौरान पुनर्निर्देशन का ख्याल रखता है।
MrPaulch

ऊह, समस्या हालांकि। SDK प्रलेखन से: "ध्यान दें कि यह तकनीक यह पता लगाने का एक विश्वसनीय तरीका नहीं है कि ऑपरेटिंग सिस्टम विंडोज का 64-बिट संस्करण है क्योंकि 32-बिट विंडोज के वर्तमान संस्करणों में कर्नेल 32.ll भी इस फ़ंक्शन को समाहित करता है।"
कोड़ी ग्रे

7

सी #, 60 50 बाइट्स

_=>System.Environment.Is64BitOperatingSystem?64:32

धन्यवाद @TheLethalCoder


1
साइट पर आपका स्वागत है! :)
DJMcMayhem

4
यदि आप 'लाइन' को हटाते हैं तो 4 बाइट्स बचाएं
जॉन

1
'पर्यावरण' को भी हटा सकते हैं। और 'कंसोल'। using static System.Environment;using static System.Console;
जॉन

1
भी बदल WriteLineकरने के लिएWrite
थॉमस अयूब

7
@ जॉन आखिरी बार जब मैंने जाँच की थी, तो आयात को शामिल किया जाना चाहिए और इसलिए बाइट की संख्या में वृद्धि होगी
Ceshion

6

रूबी, 22 बाइट्स

p [?a].pack(?p).size*8

["any string"].pack("p")एक स्ट्रिंग देता है जिसका बाइट पॉइंटर की ओर इशारा करता है जो ओर इशारा करता है "any string", और 8 अक्षर है यदि ओएस 64-बिट है, या 4 वर्ण अगर ओएस 32-बिट है।


चूंकि यह पॉइंटर आकार का उपयोग कर रहा है, यह 32-बिट प्रिंट करेगा जब रूबी दुभाषिया 64-बिट ओएस पर 32-बिट बाइनरी है। तो एक नियम याद आता है।
डार्कडस्ट

1
@DarkDust You can assume that users will use 64 bit software whenever possible.तो 64-बिट उपयोगकर्ताओं को 64-बिट रूबी चलाने के लिए माना जाएगा।
वैल्यू इंक

6

आर, 16 बाइट्स

.Machine[[18]]*8

सूचक का आकार लौटाता है।


1
सभी पॉइंटर-आकार के समाधानों की तरह, यह गलत परिणाम प्रिंट करेगा जब प्रोग्राम 64-बिट ओएस पर चलने वाला 32-बिट बाइनरी है।
डार्कडस्ट

1
@DarkDust R की व्याख्या की जाती है, और हम यह मान सकते हैं कि उपयोगकर्ता 64-बिट सॉफ़्टवेयर का उपयोग करता है, जहाँ संभव हो, इसलिए 64-बिट व्याख्याकार भी। IMHO, नियम केवल संकलित भाषाओं पर लागू होता है
NieDzejkob

@NieDzejkob वही सटीक तर्क है जिसका उपयोग मैंने अपने उत्तर में PHP के लिए किया है जब कोई और मेरे उत्तर के जवाब में उसी प्रकार की टिप्पणी करता है, तो मैं चाहता हूं कि अन्य लोग भी प्रश्न से वैसा ही पढ़ें जैसा कि हम मानते हैं कि उपयोगकर्ता 64- का उपयोग करेंगे। बिट सॉफ्टवेयर जहां व्याख्या भाषाओं के साथ संभव है।
बजा

6

पर्ल, 18 15 18 बाइट्स

say length pack p8

मैं 64␤अपने 32 बिट कंप्यूटर पर मिलता हूं, क्योंकि perl64 बिट IV के साथ बनाया गया था। आप पाएंगे कि यह आमतौर पर विंडोज के 32 बिट संस्करण पर चलने के दौरान होता है।
ब्रैड गिल्बर्ट

@ BradGilbertb2gills मैंने पिछले संस्करण के कोड को वापस कर दिया है; इस मामले में भी काम करना चाहिए। मुझे पता है अगर यह अभी भी काम नहीं करता है, तो मैं अपना जवाब हटा दूंगा।
ग्रिमी

1
यह सही ढंग से काम करता है।
ब्रैड गिल्बर्ट

HP 9000/785 पर गलत लगता है। 32 देता है। लेकिन मुझे नहीं लगता कि 32-बिट एचपी / पीए-आरआईएससी सीपीयू थे।
ओले तांगे

6

x86 मशीन कोड, 8 बाइट्स

31 C0 B0 40 48 24 60 C3

Ungolfed:

31 c0    xor eax,eax
b0 40    mov al, 0x40
48       dec al — in 32-bit mode; "REX.W" in 64-bit mode (ignored)
24 60    and al, 0x60
c3       ret

यदि 64-बिट निष्पादन योग्य के रूप में संकलित किया जाता है, तो यह 64 में वापस आ जाता है eax , और यदि 32-बिट के रूप में संकलित किया जाता है, तो 32 - ओएस की परवाह किए बिना वापस आ जाता है।

यह उत्तर यह कहते हुए नियमों पर निर्भर करता है:

आप मान सकते हैं कि उपयोगकर्ता जब भी संभव हो 64 बिट सॉफ्टवेयर का उपयोग करेंगे।


जबकि यह एक दिलचस्प दृष्टिकोण है, इसे इस तरह से एक कार्यक्रम में कैसे लिखा जा सकता है कि यह वास्तव में निष्पादित हो सकता है? प्रत्येक विधि जो मैं अपने लोडर फ़ंक्शन को लिखने के अलावा बाइनरी कोड को निष्पादित करने के बारे में सोच सकता हूं, वह उन फ़ाइलों का उपयोग करता है जो 64-बिट या 32-बिट कोड के लिए विशिष्ट हैं। इसलिए, आपको वास्तव में चलाने के लिए इस कोड की दो प्रतियों की आवश्यकता होगी ...
जूल्स

@ जूल्स आप इसे इनलाइन असेंबली के रूप में एक उच्च-स्तरीय भाषा कार्यक्रम में डाल सकते हैं, जैसे यहां । फिर आपको बस अपने प्लेटफ़ॉर्म-नेटिव कंपाइलर को उसके डिफ़ॉल्ट विकल्पों के साथ उपयोग करने की आवश्यकता है, और आपको बिटनेस मिलेगा।
रुस्लान

@ l4m2 तुम मुझ पर चिल्लाते क्यों हो? लेकिन आप वैसे भी सही हैं, ये दो बाइट्स मेरे प्रयोगों से कुछ कबाड़ बची हुई लगती हैं। निकाल देंगे।
रुस्लान

5

PHP, 18 बाइट्स

<?=PHP_INT_SIZE*8;

यह 32, 64 और अन्य बिट सीपीयू के सभी मामलों को सही ढंग से संभालता है बशर्ते कि PHP_INT_SIZE सही है, यह सीपीयू के सटीक आकार को दिखाएगा कि सीपीयू PHP क्या चल रहा है!

अगर PHP चालू है

32-बिट OS PHP_INT_SIZE == 4,

64-बिट OS PHP_INT_SIZE == 8,

16-बिट OS PHP_INT_SIZE == 2 (सैद्धांतिक रूप से)

8-बिट OS PHP_INT_SIZE == 1 (फिर सैद्धांतिक रूप से)

128-बिट OS PHP_INT_SIZE == 16 (अभी तक प्राप्त नहीं हुआ है लेकिन संभव है)


2
उस स्थिरांक में OS का आकार होता है जहाँ PHP बनाया गया था, न चला
Einacio

2
@Einacio हां, लेकिन शुरुआती चुनौती में पोस्टर में लिखा गया था "आप यह मान सकते हैं कि उपयोगकर्ता जब भी संभव हो 64 बिट सॉफ्टवेयर का उपयोग करेंगे", इसलिए यदि ओएस 64-बिट है, तो ओएस पर चलने वाले PHP के संस्करण को ग्रहण करना होगा। 64-बिट रहो! (नोट: मैं इसे प्रारंभिक चुनौती से दूर केवल शुद्ध तर्क के रूप में नहीं देखता हूं।)
बाजा

4

सी # (29 बाइट्स)

Console.Write(IntPtr.Size*8);

10
सभी पॉइंटर-आकार के समाधानों की तरह, यह गलत परिणाम प्रिंट करेगा जब प्रोग्राम 64-बिट ओएस पर चलने वाला 32-बिट बाइनरी है।
डार्कडस्ट

1
यह निर्दिष्ट करने की आवश्यकता है कि यह "AnyCPU" के लिए "प्राथमिकता 32-बिट" चेकबॉक्स अनचेक के साथ संकलित है।
कोडी ग्रे

4

शक्ति कोशिका, 17 52 बाइट्स

try{32+32*((gci \*`))-or(arch)[-1]-eq52)}catch{32}

यदि 64 में से कोई भी सत्य है, तो रिटर्न:

  • आपके पास अपने मौजूदा ड्राइव पर एक निर्देशिका है जो एक फ़ाइल नाम के साथ एक नज़दीकी पैरेन में समाप्त होता है, विचार का पता लगाने के लिए Program Files (x86)
  • arch4(जैसे ASCII 52) में समाप्त होने वाला एक स्ट्रिंग देता है , जैसे x86_64, उदाहरण के लिए i686

अगर आप कुछ भी वापस नहीं करते हैं और आपके पास एक आर्च नहीं है, तो ट्राइ -कैच का उद्देश्य आपको मिलने वाली त्रुटि को रोकना है । मुझे अब तक ऐसा करने का कोई छोटा रास्ता नहीं मिला है। GCI से अधिक प्रयोग किया जाता है ls , क्योंकि लिनक्स पर ls एक दृश्य त्रुटि उत्पन्न करेगा।

इस संस्करण का पता लगाना चाहिए कि क्या OS केवल PowerShell के बजाय 64-बिट है, और विंडोज और लिनक्स पर काम करने के लिए परीक्षण किया गया है। मैक समर्थन के लिए, के archसाथ बदलेंuname -m

पिछला Windows- केवल संस्करण: -!(ls \*`))*32+64


क्या लिनक्स डिस्ट्रो इस पर चलता है?
1842 को tuskiomi

@tuskiomi ओह, मेरा बुरा - मैं देख रहा हूँ कि तुम क्या मतलब है। चुनौती को ठीक से नहीं पढ़ा। क्या मुझे उत्तर हटाना चाहिए?
एंडी सी।

यदि आप जानते हैं कि यह वाइन के साथ काम करेगा, तो आपको इसे रखना चाहिए।
tuskiomi

@tuskiomi बहुत कम से कम Ubuntu 14.04, 16.04, RHEL7, CentOS7 और SUSE के कुछ संस्करण: github.com/PowerShell/PowerShell/releases
Xudonax

4

स्विफ्ट 4 REPL / खेल का मैदान, 12 बाइट्स

Int.bitWidth

Intशब्द का आकार है, Int32या तो Int64प्रणाली के आधार पर या जैसा कार्य करता है।


क्या यह एक कोड-स्निप नहीं है, इसलिए इसे प्रिंट करना चाहिए? या कह रहा है कि आप REPL का उपयोग कर रहे हैं कि प्रतिबंध के आसपास हो?
लिंडन व्हाइट

1
यह जजों पर निर्भर है। REPL उपयोग बहुत आम नहीं है, लेकिन स्विफ्ट प्लेग्राउंड बहुत लोकप्रिय हैं (विशेषकर iPad पर)। व्यक्तिगत रूप से, मुझे लगता है कि यह उचित खेल है। लोग गोल्फ के लिए कस्टम प्रोग्रामिंग भाषाओं को डिज़ाइन करते हैं, जो कि स्पष्ट रूप से मूल्यों को प्रिंट करते हैं, और यह अलग नहीं है
अलेक्जेंडर

4

रूबी, 10 बाइट्स

p 0.size*8

जबकि रूबी किसी भी लंबाई के पूर्णांक का उपयोग कर सकता है, आंतरिक रूप से यह उन मूल्यों को संग्रहीत करता है जो मशीन शब्द में फिट होते हैं Fixnum। विधि Fixnum#sizeहमेशा मशीन शब्द के बाइट्स में लंबाई वापस करती है।

Fixnumवर्ग रूबी 2.4.0 में हटा दिया गया था, अपनी कार्यक्षमता वर्ग में शामिल किया गया था Integer। कोड खड़ा है।


4

शैल, 26 बाइट्स

uname -m|awk \$0=/_/?64:32

आप उपयोग कर सकते हैं archके बजाय uname -m
डेनिस

1
@ डेनिस जरूरी नहीं है। मैकोस पर: uname -m-> x86_64, लेकिन arch-> i386। क्योंकि मैकोस :( इसके अलावा, यह बैश-विशिष्ट है - zsh पर विफल रहता है।
viraptor

@StevenPenny एक ग्लोब / सिंगल कैरेक्टर वाइल्डकार्ड zshके ?रूप में व्याख्या करने की कोशिश करेगी ।
दरवाज़े

क्या यह विंडोज पर चलता है?
अजासजा

1
साइजविन के साथ @ अजाजा
स्टीवन पेनी


4

सी, 22 बाइट्स

f(){return(int**)0+8;}

यह एक सूचक-आकार आधारित उत्तर है जो एक देशी बाइनरी मानता है। 0करने के लिए डाला जाता है int**(पता 0x0)। फिर हम 8 से 0 जोड़ते हैं, जो कि सी एडवांस में, पॉइंटर द्वारा sizeof(int*)*8। 4 बाइट्स * 8 बिट्स = 32, 8 बाइट्स * 8 बिट्स = 64. तो हम प्राप्त करते हैं (int**)0x20और 0x40जो तब निहितार्थ के रूप में डाली जाती हैं, जो उन्हें एक निहित int-कार्य समारोह से लौटाते हैं।

सी, स्टैंड-अलोन, 34 बाइट्स

main(){printf("%d\n",(int**)0+8);} 

सी, यूनिकोड के साथ मजेदार, 30 कोड-पॉइंट, 34 बाइट्स (UTF-8)

main(){puts((int**)U" ㈳㐶"+1);}

मैं यह समझने की कोशिश कर रहा हूं कि यह कैसे काम करता है, लेकिन मैं क्लूलेस हूं। क्या आप एक स्पष्टीकरण जोड़ सकते हैं?
नीदेज्ज्कोब

@jbcreix चालाक ...
NieDzejkob

3

जावा, 50 बाइट्स

int b(){return com.sun.jna.Native.POINTER_SIZE*8;}


क्या वह पुस्तकालय है? यदि हाँ, तो आपको इसका उल्लेख करना चाहिए! मैं ओरेकल के JDK 8 में उपलब्ध उस वर्ग को नहीं देखता (हालांकि, मेरे पास मेरे सामान्य JDK 6 और 7 मेरे निपटान में नहीं है, atm)।
ओलिवियर ग्रेजायर

2
यह उत्तर अमान्य है। यह नहीं छपता।
फिलिप

6
कोटिंग डेनिस:> यह भी कहता है कि सामान्य कोड गोल्फ नियम लागू होते हैं, और एक समारोह से वापस आना I / O के लिए हमारी चूक का हिस्सा है।
आसू

इसे कम बाइट्स के लिए एक लांबा फ़ंक्शन में बदलें:()->com.sun.jna.Native.POINTER_SIZE*8
फेरीबिग

3

PHP, 29 बाइट्स

<?=@php_uname(m)[-1]-4?32:64;

https://3v4l.org/Y6JXv


ऊह। मैं यह पसंद है। यह कैसे काम करता है?
tuskiomi

4
php_uname('m')x86_6464 बिट ओएस पर रिटर्न , अन्यथा कुछ पसंद है i3864स्ट्रिंग के 6 वें वर्ण (5 वें 0 अनुक्रमित) होने के नाते '4' - 4 == 0 == false,। और @सिर्फ अयोग्य स्ट्रिंग्स के लिए चेतावनियों को दबाता है, और असिंचित ऑफसेट।
पेटा

2
यह PHP के आर्किटेक्चर का पता लगाता है, ओएस का नहीं। मैं 64-बिट विंडोज पर 32-बिट PHP चला रहा हूं, php_uname('m')रिटर्न करता हूं 'i586'
ग्रास डबल

@GrasDouble अच्छी तरह से मुझे लगता है ymmv, मैं मेरे साथ काम करता है Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64
पेटा

1
@tuskiomi 64 को प्रिंट करेगा अगर 8-बिट ऑपरेटिंग सिस्टम है
Bja

3

पायथन 3 , 77 84 71 59 बाइट्स

-13 बाइट्स, @JonathanAllan को धन्यवाद!
59 से नीचे @Clearer

from platform import*;print({'4':64,'6':32}[machine()[-1]])

इसे ऑनलाइन आज़माएं!

मेरी मुट्ठी समय कोड-गोल्फिंग :)
64 बिट-ओएस पर 32 बिट-पायथन चलाने पर भी सही संस्करण का उत्पादन करना चाहिए।
यह मानते हुएplatform.machine() लेता है i*86या x8632 बिट ओएस के लिए। यह जाँचने के लिए मेरे पास उपलब्ध नहीं है। आउटपुट 0तब होता है जब OS 64 / 32Bit में नहीं होता है।
संपादित करें: प्रिंट स्टेटमेंट जोड़ा गया है, इसलिए यह 7 बाइट्स से अधिक लंबा हो गया है


निश्चित नहीं है कि अगर यह स्वीकार्य है क्योंकि 64 बिट मशीन पर 32 बिट ओएस चलाना संभव है (या कुछ मशीन जिसे foo8664 बिट: पी) कहा जाता है , लेकिन अगर यह स्वीकार्य है तो आप 9 (संपादन) को बचा सकते हैं। .13!) के साथ बाइट्स print((a==64)*a+32*(a==86))
जोनाथन एलन

from platform import*;print({'4':64,'6':32}[machine()[-1]])काम भी करेगा।
क्लियर

@ क्लेयर यह कमी के बाद छूट जाएगा: महत्वपूर्ण: यदि कोई 32 या 64 बिट नहीं है तो अल्फ़ान्यूमेरिक वर्णों के किसी अन्य गैर-रिक्त स्ट्रिंग को प्रिंट करें।
बजे

@tOmAtE अगर यह 32 या 64 बिट नहीं है, तो यह एक अपवाद फेंक देगा, जो एक गैर-खाली स्ट्रिंग प्रिंट करता है।
स्पष्ट

2
वास्तुकला की कोशिश करो (), तानाशाही को बचाता है: from platform import*;print(architecture()[0][:2])-> 50 बाइट्स
Bugmenot123
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.