İşletim sistemim 32 bit mi, 64 bit mi?


52

Artık çok önemli değil, ama ara sıra birinin bilmesi gerekiyor.

İşte basit bir golf: Kullanıcı girişi yok, kodun çalıştığı bilgisayarın 64 bit işletim sisteminde mi, yoksa 32 bit işletim sisteminde mi olduğunu söyle!

Kod 32 bit işletim sisteminde çalıştırılıyorsa, "64" yazdırın, kod 64 bit işletim sisteminde çalışıyorsa "64" yazın. Önemli: 32 veya 64 bit değilse, boş olmayan diğer alfasayısal karakter dizelerini yazdırın.

Lütfen 64 bit işletim sistemine sahip bir bilgisayarda çalışan 32 bit programın "64" vermesi gerektiğini unutmayın. Kullanıcıların mümkün olduğunda 64 bit yazılımı kullanacaklarını varsayabilirsiniz.

Giriş için uygun olması için, kodunuzun Windows 4.10 veya daha yeni Microsoft destekli Windows sistemlerinde ve seçtiğiniz en az bir Linux tadı (bu tat ücretsiz olduğu sürece) kullanabilmelidir. Program hala doğru değeri döndürdüğü sürece uyumluluk modları kurulabilir.

Her zamanki kuralları geçerlidir.

Not: Cevabınız yalnızca 32 veya 64'ü yazdırmaksa, ancak alt vakayı yazmıyorsa, kabul edeceğim ancak rakip bir cevap değil.

Daha sonra bu kodları farklı işletim sistemlerinde çalıştırmanın sonuçlarını deneyeceğim ve göndereceğim!


5
Bu nedenle, "64 bit işletim sistemine sahip bir bilgisayarda çalışan 32 bitlik bir programın" 64 "vermesi gerektiğini lütfen unutmayın. Kullanıcıların, mümkün olduğunda 64 bit yazılım kullanacaklarını varsayabilirsiniz." tercüman / derleyici vb. hem 32 bit hem de 64 bit olarak kullanılabilirse, o zaman bir 32 bit işletim sistemi, tercüman / etc'nin 32 bit sürümünü her zaman çalıştıracak ve 64 bit işletim sistemi daima 64 bit yorumlayıcıyı çalıştıracak demektir. /vb. Yani 32 veya 64 ve 32 veya 64 olması OS olma programı arasındaki farkı endişesi, temelde sadece sadece 32 bitlik uygulamaları kullanan diller için bir sorun. Sağ?
Lyndon White,

2
Buradaki birçok çözüm, programı derlemek için 32 bit derleyici kullanılması durumunda 64 bit işletim sistemine "32" yazdırır. Bu tamam mı?
Martin Rosenau

15
Dünyada "Windows 4.10" nedir? Bu, Windows 98 anlamına mı geliyor? Yoksa Windows NT 4 mü demek? Bundan daha "yeni" olarak ne düşünüyorsunuz? Bu istisnai olarak kötü düşünülmüş bir mücadele gibi görünüyor .
Cody Gray

13
"Resmi pencere özellikleri" yoktur ve hiç kimse Windows 98'i "Windows 4.10" olarak tanımlamaz. Kelimenin tam anlamıyla ilk sizsiniz. Bu yüzden belki de sürüm numaralarını kullanarak havalı veya resmi görünmeye çalışmak yerine, sadece gerçek ürün adını kullanmalısınız . Bu arada, Windows 9x 64-bit bir sürümde asla mevcut değildi, bu yüzden benim için yalnızca Windows 98'de çalışan ve sadece "32" döndüren bir yazı göndermem meşru olur mu? Çok adaletsiz / sportmen olmayan / ilgi çekici görünüyor, ancak teknik olarak sizin kurallarınızla izin veriliyor.
Cody Gray,

3
Windows sürümü hakkındaki soruyu hala cevaplamadınız. Does Windows'un 4.10 veya daha yeni çalıştırmak gerekir ortalama Windows'un 4.10 ve tüm yeni sürümlerinde veya herhangi tek bir Windows sürümü, 4.10 veya daha yeni sürümünde ?
Dennis,

Yanıtlar:


45

x86 Meclisi (polyglot), 13 bayt

Bytecode:

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

32 bit olarak yorumlanırsa 32, 64 bit ise 64 ve 16 bit ise 32767 döndüren bir işlev tanımlar.

Windows ve Linux'ta çalışan bir çokgen yapmak istedim, ancak bu düşündüğümden daha zor. Olduğu gibi, 16 bit olmayan Windows’a bağlantı vermeden bir değer yazdırmanın bile bir yolu olmadığından emin değilim.

açıklama

Bu kod, üzerinde çalıştığı mimariyi belirlemek için iki ifade kullanır. İlki, 0x48 komutudur - 16 ve 32 bitlerde, bu dec %eax, ancak 64 bitte, bir komut boyutu önekidir. İkinci anlatım aynı talimattır, ancak, değeri 0x8000 değerinde çalıştırdığımızda, en anlamlı bit yalnızca kayıt büyüklüğü 16 bit olduğunda çevrilir, taşma bayrağını ayarlar ve kullanmamızı sağlar jo.

16 bitte, bu kod aşağıdaki gibi yorumlanır:

   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 bitte, bu kod aşağıdaki gibi yorumlanır:

   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 bitte, bu kod aşağıdaki şekilde yorumlanır:

   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

Bu aslında muhtemelen lider, çok güzel
tuskiomi

1
Çok temiz bir fikir, ancak uygulandığı gibi, 32 bitlik bir ikili dosya olarak birleştirildiğinde ve 64 bitlik bir işletim sisteminde çalıştırıldığında yanlış değeri döndürür.
Cody Gray

@CodyGray kurallardan: Kullanıcıların mümkün olduğunda 64 bit yazılımı kullanacaklarını varsayabilirsiniz. Sanırım bu, işlevler için arayan kodunun mümkün olduğunda 64 bit olduğunu varsayabiliriz anlamına gelir.
Ruslan

Ah, sanırım bu adil bir yorum, @Ruslan. Ve görüyorum ki, aklımdaki cevabı zaten göndermişsin, bu konuda değil miydi. :-) Benim oyum var.
Cody Gray

bayt gelmez 48temsil dec %eax16 bit modunda?
phuclv

49

x86 makine kodu, 12 bayt

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

Bu işlev, ELF32'de kullanıldığında, i386 SysV ABI'yi takiben Linux'ta, PE32'de kullanıldığında Windows / Wine'da stdcallçağrı kurallarını takip ederek Linux'ta çalışır .


Aslında bir başka yaklaşım izlerse, bayt sayısını daha da azaltabilirsiniz .
Ruslan

Bu teorik olarak 32/64 bit olmayan bir ortamda ne yapardı?
tuskiomi

1
@tuskiomi Herhangi bir durumda, bu kodu hala 32 veya 64. gelen mnemonic'ler bir değişim olacaktır, 16-bit modunda bu bayt dizisini yorumlamak tek fark her iki döner eaxiçin ax. Bu yüzden, eğer seçici csgelirse 0x23, sonuç 64 olur, aksi takdirde 32.
Ruslan

Bu olsa da, iki özel işletim sistemine özgü görünüyor. Cs = 0x23 ile kolayca 32-bit bir sisteme sahip olabilirsiniz. Bunun yerine CPU'yu hedef alan 8 baytlık cevabım bölümüne bakın.
Peter Ferrie

@peterferrie evet, bu yüzden başka bir cevabım var . Ama seninki 2 bayttan daha üstün.
Ruslan

32

Mathematica, 17 bayt

$SystemWordLength

13
Elbette bir yerleşik var! s (+1)
tuskiomi

Eklemeniz &veya bunun REPL'de olduğunu belirtmeniz gerekmez mi ?
LegionMammal978 19:17

5
@ LegionMammal978 "Kod, 32 bit işletim sisteminde kullanılıyorsa, kod" 64 bit işletim sisteminde kullanılıyorsa, "64" yazıyorsa, "32" yazdırın. eğer ikisi de değilse. " "Çalıştığında bunu yapan bir işlev sağlamaz"; sadece "bunu yap".
Patrick Stevens

17
@PatrickStevens: Eğer soru bir gönderimin hangi formda olması gerektiğini belirtmiyorsa, bu bir program veya işlevdir, ancak varsayılan olarak bir snippet değildir .

3
@ ais523 Mathematica'da programlar, işlevler ve snippet'ler arasında bir ayrım olmadığını iddia ediyorum. Her şey sadece bir ifadedir.
ngenis,

21

Önyükleme Yükleyicileri

GRUB ve IPXE'nin çalışma zamanında erişilebilen tam programlama dilleri olduğunu biliyor muydunuz? Syslinux boot yükleyicileri ailesi bunu yapmazlar fakat bunu yapabilirler.

IPXE, 36 bayt

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

komut satırı uzaktan çalıştırılıyorsa ilk satır gerekir, ancak doğrudan komut satırına yazılırsa kullanılmaz.

GRUB, 42 bayt

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

Syslinux, 186 bayt

Bu, ilk dosya syslinux.cfg (ya da isolinux.cfg vb.) Olan üç dosyayı alır.

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

ve t.cfg

menu title 32

ans s.cfg

menu title 64

Bunun için zor kısım syslinux'un herhangi bir basit metin görüntüleme özelliğine sahip olmaması, bu nedenle menünün kötüye kullanılmasıdır.


Os çözünürlüğünü bir önyükleyici ile anlatabildiğinden emin değilim, ama fikri
sevdim

CPU'yu kontrol eder ve doğru işletim sistemini seçmek için kullanılır. Bu temel olarak benim açılmayan projemin kodlu kodudur.
hildred

2
Böylece os mimarisini temel alarak değiştirir. Kutunun dışında düşünmek. Severim.
tuskiomi

Bayt sayısı nedir?
Restioson

1
@hildred Sana kullanılırsa daha okunabilir olacağına inanıyorum ## iPXE, 36 bytesyerine### ipxe 36
NieDzejkob

21

Julia 14 13 bayt

n->8sizeof(1)

Açıklamak:

  • Anon fonksiyonu, nothingbir tamsayı 32 ya da 64'ü döndüren bir şey alarak (dahil )
  • Tamsayı değişmezleri, Int32 bit veya 64 bit olup olmadığına bağlı olarak bir Int32veya bir türdür Int64( 1herhangi bir rakam olabilir)
  • Bir fonksiyon çağrısından önce bir sayı koymak yan yana çarpma yapar
  • Bu, temel olarakSys.WORD_SIZE , rahnema1'in yanıtında kullanılan , kodun küçültülmüş bir sürümüdür.

Diğer eğlenceli bir cevap ()->"$(Int)"[4:5], ama bu konuda geri sayım alamıyorum.


@Roman Gräf'a teşekkürler


Sahte bir argüman kullanabilirsiniz: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

julia, 20 17 16 bayt

n->Sys.WORD_SIZE

* @LyndonWhite sayesinde 3 bayt kurtardı * @ RomanGräf sayesinde bir bayt kurtardı

Önceki cevaplar:

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

Çevrimiçi deneyin!


1
Ben, şahsen, bunun gibi!
tuskiomi

2
Kuralları izleyerek: codegolf.meta.stackexchange.com/q/2419/62131 yaparak 3 bayt tıraş edebilirsiniz()->Sys.WORD_SIZE
Lyndon White

1
Ayrıca sahte bir argüman da kullanabilirsiniz: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js), 24 bayt

_=>process.arch.slice(1)

Bu fonksiyon ve iadeler ise '32', '64'veya hiçbiri eğer 'rm'.


+1, ancak 64 bitlik bir yayının 32bit işletim sistemi çalıştıracağını düşünüyorum
Octopus

1
Bana 32-bit Windows'da '32' verir, bu yüzden işe yarıyor.
Ken YN,

5
REPL kullanıyorsanız ve osbunun yerine 7 bayt tıraş edebilirsiniz process:os.arch().slice(1)
GilZ

Bu, gerçek işletim sistemi mimarisini değil, sürece bildirilen işletim sistemi mimarisini döndürür. Yani bu Linux'ta çalışmıyor. (Favori arama motoruna Punch "setarch".)
David Schwartz

@DavidSchwartz yanlış anlamadığım sürece linux kutumda düzgün çalışıyor, ancak PPCG'de kullanıcı kemer değiştirme konusunda değiştirilmemiş bir ortam varsayabiliriz
Downgoat

12

C, 33 31 29 23 bayt

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

Golf önerileri için @ceilingcat ve @Dennis yorumcularına teşekkürler!


13
Ayrıca normal kod golf kurallarının geçerli olduğunu ve bir işlevden geri dönmenin G / Ç için varsayılan değerlerimizin bir parçası olduğunu söylüyor.
Dennis

11
Bu, 32 bit mi yoksa 64 bit program mı derleyeceğinize bağlı değil mi?
Ken YN,

4
Bu şartlara uymuyor. " Lütfen 64 bit işletim sistemine sahip bir bilgisayarda çalışan 32 bit programın" 64 "vermesi gerektiğini unutmayın. Bu, işletim sisteminin ne olduğunu değil, programın nasıl derlendiğini gösterir.
David Schwartz

2
@DavidSchwartz "Kullanıcıların mümkün olduğunda 64 bit yazılımı kullanacaklarını varsayabilirsiniz."
Klas Lindbäck

2
Bunu söylediğim için üzgünüm ama derleme zamanında size değerlendirilir. Eğer bir 32 bit exe derlerseniz ve 64 bit bir makinede çalıştırırsanız, 64 çıkması gerekirken 32 çıkacaktır ( stackoverflow.com/questions/2615203/… ). Yine de güzel fikir!
Dinaiz

11

PowerShell, 16 bayt

8*[IntPtr]::Size

İşaretçi boyutunu bayt olarak alır, bitleri almak için 8 ile çarpar.


-1 çünküyour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r veya daha yeni, değil ve daha yeni. Bahse girerim ki bu cevapların iyi bir kısmı, en iyi ihtimalle, uzun süredir desteklenmeyen bir Windows sürümünde çalıştırılabilir. Aynı zamanda, insanların tüm işletim sistemlerinde 98 üzerinde test yapmalarını beklemek de mantıksız - bugünlerde bir VM'ye kurmak bile kolay değil (güven bana, denedim. KVM'de çalışmayacak ve VBox ekran adaptörleri ile ilginç etkileşimlere sahip) . ( 64-bit kavramına bile sahip değil ... bu gerçekten saçma bir gereksinim.)
Bob

1
@ ub3rst4r Burada yorumlanan programlama dillerinin hepsinin Windows 4.10'da çalışan bir uygulaması olduğundan şüpheliyim!
Martin Rosenau

1
64-bit işletim sistemi üzerinde 32 bit bir powershell ise, başarısız gibi görünüyor.
Chris J,

@ChrisJ En azından Win10 ve Win2012 R2'de, x86 PowerShell'den uygun sonucu verir. Linux'ta test edilmedim.
Booga Roo,

10

Python 2, 52, 48, 42 41 bayt

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

Tamamen insanlara teşekkürler!


zoom! Bir dakikadan az bir sürede hat boyunca.
tuskiomi

Eve gelene kadar bunu test etmeye devam edeceğim, ancak bunun "32" ve "64" yazdığından emin değilim, ancak diğer durumlarda kendime güveniyorum.
tuskiomi

@tuskiomi, bu "32 bit" veya "64 bit" yazıyor
Daniel

1
from struct import*;print calcsize("P")*8daha kısa.
tamamen insanlık

12
Bunu 64 bit işletim sisteminde 32 bit Python'da çalıştırırsanız, bunun size yalan olacağını düşünüyorum. Diğer cevapların çoğu da yine de hassas görünüyor ...
Nick T

10

Java 8, 45 bayt

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

@Dopapp Ne anlama geliyor? Bunun bir snippet olduğu, bir program veya fonksiyon değil. Java 8'de bu çalışmalıdır:n=>System.getProperty("os.arch")
NoOneIsHere

@HayırOnlarHere, oh teşekkür ederim kafamın üzerinden geçen yol
Daniel

2
"Kod bir 32 bit işletim sisteminde çalıştırıldıysa," 64 "işletim sisteminde çalıştırıldıysa," 32 "yazdırın," 64 "çıktı alın. de. ". Bu hiç bir şey yapmıyor ...
Olivier Grégoire

4
Windows 98 için Java 8'i (v4.10) alabilir misiniz?
MozaiklerHeckler,

4
@TessellatingHeckler Java 8 "i586" gerektirir (bu her ne demekse). Girdi: "kodunuz Windows 4.10 veya daha yenisinde çalışabilmelidir ", "kodunuz Windows 4.10 ve daha yenisinde çalışabilmelidir " değil. Daha yeni bir Windows üzerinde çalışır .
Olivier Grégoire


8

Windows CMD, 56 52 bayt (teşekkürler Bob!)

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

Hala şaşırtıcı derecede uzun - şimdiye kadar en uzun!


1
Aslında, %windir%\SysWOW64daha kısa, sanırım ...
Bob

7
" Windows 4.10 veya daha yenisinde çalışabilmelidir ve seçtiğiniz Linux'un en az bir tadı " - bunun için hangi Linux tadı?
MozaiklerHeckler

1
@TessellatingHeckler Şarap yüklerseniz ...?
Ken YN

1
Stenografi kullanmaya ne dersiniz? if EXIST "c:\Progra~3" (echo 64)else echo 32Varsayılan olarak siz varsınız ProgramDatave Program Filesbu yüzden üçüncü bir tane varsa, biz 64 olmalıyız
Marie

3
Bu 8 bitlik bir işletim sistemi için ne yazdıracak?
tuskiomi

7

C, Win32 API, 103 183 bayt

#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;}

Aslında burada 2'den fazla dava var. Onları inceleyelim

  • En kolay: IsWow64Processmevcut değil: 32 bit işletim sistemindeyiz

Sonraki iki durumda, ikili dosyamızın 32 bit çalıştırılabilir olacağı bilgisine sahip olmamız gerekir. Ve bu tanımlamanın çıkış parametresinde ne olacağıIsWow64Process

İşlem WOW64'ün altında çalışıyorsa TRUE olarak ayarlanmış bir değere işaretçi. İşlem 32 bit Windows altında çalışıyorsa, değer FALSE olarak ayarlanır. İşlem 64 bit Windows altında çalışan 64 bit bir uygulama ise, değer FALSE olarak ayarlanır.

Bu bizi iki vaka daha bırakıyor:

  • IsWow64Process var ve verim TRUE -> 64 bit bir makinedeyiz
  • IsWow64Process var ve verim YANLIŞ -> 32 bit bir makinedeyiz

64 bit Windows'ta 64 bit bir uygulamanın FALSE sağladığı bölümden endişe etmiyoruz. Bizim uygulamamızın 32-bit olduğunu bildiğimiz gibi

Oh ve bu zorluk kapsamında olmayan ve yine de nadir olması gereken bir ek vaka daha var:

  • IsWow64Process var, ancak başarısız oluyor: Varsayılan olarak 32-bit makineye.

Bu, çoğu Windows NT İşletim Sistemini kapsamalıdır. Yalnızca Win10 64-Bit, Win 7 64-Bit, Win 8.1 32-Bit ve WinXP SP1 32-Bit üzerinde test ettiniz


Orijinal cevap:

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

Emin olmak için sadece 2 vakayı ayırmamız gerekiyor.

  • IsWow64Process kernel32.dll içinde yok => 32 bit bir makinedeyiz.

  • IsWow64Process var => 64 bit bir makinedeyiz.

IsWow64ProcessHer durumda ikilinin 32bit olmasını istediğimizden, sağlanan gerçek değer bu zorluk için önemli değildir.

Cevapların çoğundan farklı olarak, bu, çalıştırıldığı makinede derlenen ikiliye dayanmaz.

Sadece 64bit ve 32bit makinelerde mevcut olan daha kısa bir fonksiyon bilseydim cevabı kısaltabilirdim.


2
.dllModül ad dizesinden bırakın . Sadece golf oynamak için iyi değil, aynı zamanda normal kullanımda da daha iyi bir uygulama. Ayrıca, golf amacıyla, sonradan boşluk bırakabilirsiniz #include.
Cody Gray

Teşekkürler, aslında 64bit'te bulunabilen ancak 32bit'te bulunmayan bir modülü arayarak her şeyi azaltmak istedim. Hala bakıyorum. Ne yazık ki (bu amaç için) WoW64 adında bir modül yoktur.
MrPaulch

Aslında bir var wow64.dllve Wow64Win.dllben onlarla aramayı hiç denemedim GetModuleHandle. Ancak sorun, 64-bit bir makinede çalışan 64-bit bir işlem için değil , 64-bit bir makinede çalışan 32-bit bir işlem için yüklenecek olmalarıdır .
Cody Gray

Sahibim. 64 bit makinede bile 0 döndürürler. Aslında mantıklı. Doğrudan bağlantılı olmak için varlar. Sistem, çalışma sırasında yeniden yönlendirmeyi önemser.
MrPaulch

Ooh, sorun olsa da. SDK belgelerinde: "Bu tekniğin, işletim sisteminin Windows'un 64 bit sürümü olup olmadığını saptamanın güvenilir bir yolu olmadığını unutmayın, çünkü 32-bit Windows'un geçerli sürümlerinde Kernel32.dll de bu işlevi içerir."
Cody Gray,

7

C #, 60 50 bayt

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

Teşekkürler @TheLethalCoder


1
Siteye Hoşgeldiniz! :)
DJMcMayhem

4
'Line' kaldırırsanız 4 byte kazanın
John

1
'Çevre'yi de kaldırabilir. ve 'konsol.' varsayarak kullanımı using static System.Environment;veusing static System.Console;
John

1
Ayrıca, değiştirmek WriteLineiçinWrite
Thomas Ayoub

7
@John Son kontrol ettiğimde, ithalatlar dahil edilmeli ve böylece bayt sayımına eklenecekti
Ceshion

6

Ruby, 22 bayt

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

["any string"].pack("p")baytları işaret eden işaretçiye karşılık gelen "any string"ve işletim sistemi 64 bit ise 8 karakter veya işletim sistemi 32 bit ise 4 karakter olan bir dize döndürür .


Bu işaretçi boyutunu kullandığından, Ruby yorumlayıcısı 64 bit işletim sisteminde 32 bit bir ikili olduğunda bu 32 bit yazdırır. Yani bir kuralı özlüyor.
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.Bu yüzden 64-bit kullanıcıların 64-bit Ruby kullandıkları varsayılacaktır.
Value Ink

6

R, 16 bayt

.Machine[[18]]*8

İşaretçi boyutunu döndürür.


1
Tüm işaretçi boyutu çözümleri gibi, program 64-bit işletim sistemi üzerinde çalışan 32-bit bir ikili olduğunda bu yanlış sonucu basar.
DarkDust

1
@DarkDust R yorumlanır ve kullanıcının 64 bit yazılım kullandığını varsayabiliriz, bu yüzden 64 bit yorumlayıcı da kullanabiliriz. IMHO, kural sadece derlenmiş diller için geçerlidir
NieDzejkob

@NieDzejkob Bu, PHP cevabım için, bir başkası benim cevabımla aynı tipte bir yorum yaptığında, cevabım için kullandığım aynı mantıktır, başkalarının da kullanıcıların kullanacağı varsayımıyla aynı soruyu okumasını istiyorum. yorumlanan dillerle mümkün olan bit yazılımları.
Bja,

6

Perl, 18 15 18 bayt

say length pack p8

Ben olsun 64␤, çünkü benim 32 bit bilgisayarda perlbir 64bit IV ile inşa edilmiştir. Bunu genellikle 32bit Windows sürümünde çalışırken göreceksiniz.
Brad Gilbert,

@ BradGilbertb2gills Kodu önceki sürüme geri aldım; bu, bu durumda bile çalışmalı. Hala işe yaramazsa bana bildirin, cevabımı silerim.
Grimmy

1
Bu doğru çalışıyor.
Brad Gilbert

HP 9000/785'te yanlış görünüyor. 32 verir. Ancak 32 bit HP / PA-RISC CPU olduğunu sanmıyorum.
Ole Tange

6

x86 makine kodu, 8 bayt

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 bit çalıştırılabilir olarak derlenirse, 64 eaxdeğerini döndürür ve 32 bit olarak derlenirse, işletim sisteminden bağımsız olarak 32 değerini döndürür.

Bu cevap, şunları söyleyen kurallara dayanır:

Kullanıcıların mümkün olduğunda 64 bit yazılımı kullanacaklarını varsayabilirsiniz.


Bu ilginç bir yaklaşım olsa da, bir programa gerçekte yürütülecek şekilde nasıl yazılabilir? Kendi loader fonksiyonunu yazmak dışında ikili kod çalıştırmayı düşünebildiğim her yöntem , 64-bit veya 32-bit koda özgü dosyaları kullanır. Bu nedenle, gerçekten çalıştırmak için bu kodun iki kopyasına ihtiyacınız olacak ...
Jules

@Jules Satır içi montaj olarak, burada olduğu gibi üst düzey bir dil programına yerleştirebilirsiniz . Öyleyse platform-yerel derleyicinizi varsayılan seçenekleriyle kullanmanız yeterlidir;
Ruslan

@ l4m2 neden bana bağırıyorsun? Ama yine de haklısın, bu iki bayt benim deneylerimden bir miktar çöp kalmış gibi görünüyor. Silinecek.
Ruslan

5

PHP, 18 Bayt

<?=PHP_INT_SIZE*8;

Bu, PHP_INT_SIZE'in doğru olması koşuluyla, 32, 64 ve diğer bit işlemcilerin tüm durumlarını doğru bir şekilde ele alır, hangi CPU PHP üzerinde çalıştığından bağımsız olarak işlemcinin kesin boyutunu gösterir!

PHP çalışıyorsa

32 bit işletim sistemi PHP_INT_SIZE == 4,

64 bit işletim sistemi PHP_INT_SIZE == 8,

16 bit işletim sistemi PHP_INT_SIZE == 2 (teorik olarak)

8 bit işletim sistemi PHP_INT_SIZE == 1 (yine teorik olarak)

128-bit işletim sistemi PHP_INT_SIZE == 16 (Henüz ulaşılmadı ancak mümkün


2
Bu sabit PHP'nin yapıldığı işletim sisteminin büyüklüğüne sahiptir, çalıştırılmaz
Einacio

2
@Einacio Evet, ancak ilk zorlukta poster "Mümkün olduğunda kullanıcıların 64 bit yazılımı kullanacağını varsayabilirsin" yazıyordu. Bu nedenle, işletim sistemi 64 bit ise, işletim sistemi üzerinde çalışan PHP sürümünün kabul edilmesi gerekirdi. 64-bit ol! (Not: Bunu ilk meydan okumaya dayanan sadece bir mantık mantığı olarak görmüyorum.)
Bja

4

C # (29 bayt)

Console.Write(IntPtr.Size*8);

10
Tüm işaretçi boyutu çözümleri gibi, program 64-bit işletim sistemi üzerinde çalışan 32-bit bir ikili olduğunda bu yanlış sonucu basar.
DarkDust

1
Bunun, "32-bit Tercih Et" onay kutusunun işaretlenmemiş olduğu "AnyCPU" için derlendiğini belirtmeniz gerekir.
Cody Gray

4

Güç kalkanı, 17 52 bayt

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

Aşağıdakilerden herhangi biri doğruysa 64 değerini döndürür:

  • Geçerli sürücünüzde yakın bir parola biten bir dosya adı olan ve algılaması gereken bir dizininiz var Program Files (x86).
  • archörneğin sonuna benzer şekilde 4(ASCII 52) biten bir dize döndürür .x86_64i686

Try-catch, eğer gci bir şey döndürmezse ve bir kemeriniz yoksa, aldığınız hatayı gidermek için tasarlanmıştır . Şimdiye kadar yapmak için daha kısa bir yol bulamadım. GCI üzerinde kullanıldığı ls çünkü Linux, ls görünür bir hata üretecektir.

Bu sürüm, işletim sisteminin sadece PowerShell yerine 64 bit olup olmadığını algılamalı ve Windows ve Linux'ta çalışıp çalışmadığını test etmelidir. Mac desteği için yerini archile uname -m.

Önceki Windows yalnızca sürümü: -!(ls \*`))*32+64


Bu hangi linux dağıtımını yapıyor?
tuskiomi

@tuskiomi Oh, benim kötü - ne demek istediğini anlıyorum. Mücadeleyi doğru okumamıştım. Cevabı silmeli miyim?
Andy C.

WINE ile çalışacağını biliyorsanız, saklamalısınız.
tuskiomi

@tuskiomi En azından Ubuntu 14.04, 16.04, RHEL7, CentOS7 ve SUSE'nin bazı sürümlerinde: github.com/PowerShell/PowerShell/releases
Xudonax

4

Swift 4 REPL / Oyun Parkı, 12 bayt

Int.bitWidth

Intkelime boyutunda, sisteme bağlı olarak Int32veya Int64sisteme göre davranıyor .


Bu bir kod parçacığı değil mi, bu yüzden yazdırmalı mı? Yoksa REPL kullandığınızı söylemek bu kısıtlamanın üstesinden gelmek mi?
Lyndon White,

1
Bu hakimlere kalmış. REPL kullanımı çok yaygın değildir, ancak Swift Oyun Alanları çok popülerdir (özellikle iPad'de). Şahsen ben adil bir oyun olduğunu düşünüyorum. İnsanlar golf oynamak için özel olarak programlama dilleri tasarlarlar, bu da değerleri kesin olarak basar ve bu da farklı değildir
Alexander

4

Yakut, 10 bayt

p 0.size*8

Ruby herhangi bir uzunluktaki tamsayıları kullanabilirken, dahili olarak makine kelimesine uyan değerleri depolar Fixnum. Yöntem Fixnum#sizeher zaman uzunluğu bir makine sözcüğünün bayt olarak verir.

FixnumSınıf Ruby 2.4.0 uzaklaştırıldı, işlevselliği sınıfına dahil edilmiştir Integer. Kod duruyor.


4

Kabuk, 26 bayt

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

Sen kullanabilirsiniz archyerine uname -m.
Dennis

1
@Dennis Mutlaka değil. Makarnalarda: uname -m-> x86_64, fakat arch-> i386. Çünkü macos :( Ayrıca, bu bash'a özgüdür - zsh'da başarısız olur.
viraptor

@StevenPenny zsh, ?bir glob / single karakter joker karakteri olarak yorumlamaya çalışacaktır .
Doorknob

Bu Windows'ta çalışıyor mu?
Ajasja

1
Cygwin ile @Ajasja
Steven Penny

4

Bash, 25 17 bayt

getconf LONG_BIT

Golf yardımı için Dennis'e teşekkürler.


4

C, 22 bayt

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

Bu, yerel bir ikiliyi varsayan, işaretçi boyutuna dayalı bir cevaptır. 0Artığını int**(adres 0x0). Sonra 8 ila 0 ekleriz, bu, C ilerledikçe, gösterici tarafından sizeof(int*)*8. 4 bayt * 8 bit = 32, 8 bayt * 8 bit = 64. Böylece elde ederiz (int**)0x20ve 0x40daha sonra örtük olarak geri döndürme intişlevinden döndürerek tam sayı olarak kullanılır .

C, tek başına, 34 bayt

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

C, Unicode ile eğlenceli, 30 kod noktası, 34 bayt (UTF-8)

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

Bunun nasıl çalıştığını anlamaya çalıştım ama habersizim. Bir açıklama ekleyebilir misiniz?
NieDzejkob

@jbcreix zeki ...
NieDzejkob

3

Java, 50 bayt

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


Bu bir kütüphane mi? Eğer evet ise, bundan bahsetmelisin! Oracle'ın JDK 8'inde bu sınıfın mevcut olduğunu görmüyorum.
Olivier Grégoire

2
Bu cevap geçersiz. Yazdırmıyor.
Philipp

6
Dennis'ten alıntı:> Ayrıca, normal kod golf kurallarının geçerli olduğunu ve bir işlevden geri dönmenin G / Ç için varsayılan değerlerimizin bir parçası olduğunu söylüyor.
Asu,

Daha az bayt için lamba işlevine değiştirin:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig

3

PHP, 29 bayt

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

https://3v4l.org/Y6JXv


Ooh. Bunu beğendim. O nasıl çalışır?
tuskiomi

4
php_uname('m')x86_6464 bit işletim sistemine geri döner , aksi halde böyle bir şey i386. 4dizginin 6. karakteri (5. dizin) '4' - 4 == 0 == false. Ve @sadece tırnaksız dizeler ve başlatılmamış dengelemeler için uyarıları bastırır.
Petah

2
Bu, işletim sisteminin değil PHP'nin mimarisini tespit eder. 64-bit bir Windows 32-bit PHP çalıştırıyorum, php_uname('m')döndürür 'i586'.
Gras Double

@GrasDouble iyi ymmv sanırım, benim için çalışıyor Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah

1
@tuskiomi bu 8 bitlik bir işletim sistemi varsa 64 yazdıracak
Bja

3

Python 3 , 77 84 71 59 bayt

-13 bayt, @JonathanAllan!
@Clearer tarafından 59’a kadar

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

Çevrimiçi deneyin!

Benim yumruk zaman kodu-golf :)
64bit-OS üzerinde 32Bit-Python çalıştırırken bile doğru sürümü çıkarmalıyım.
Varsayarsak platform.machine()verir i*86veya x8632Bit-OS için. Bunu kontrol edecek uygun bir tane yok. Çıktı, 0işletim sisteminin 64 / 32Bit olmadığı
zamandır. Düzenleme: Eklenen yazdırma ifadesi, bu nedenle 7 bayt daha uzun aldı


Kabul edilebilir olup olmadığından emin değilim, çünkü 64 bit bir makinede 32 bit işletim sistemi çalıştırmak mümkündür (veya foo8664 bit: p olarak adlandırılan bazı makinelere sahip olmak mümkündür ), ancak kabul edilebilir olması durumunda 9'u kaydedebilirsiniz. .13!) İle bayt print((a==64)*a+32*(a==86)).
Jonathan Allan,

from platform import*;print({'4':64,'6':32}[machine()[-1]])de işe yarardı.
Daha net

@Clearer Bu şu kısıtlamayı kaçıracaktır: Önemli: 32 veya 64 bit değilse boş olmayan alfanümerik karakterlerin herhangi bir dizesini yazdırın. .
TOPLAM

TOmAtE ne 32 ne de 64 bit değilse, boş olmayan bir dize basan bir istisna atar.
Daha temiz

2
Mimariyi deneyin (), diktini kaydeder: from platform import*;print(architecture()[0][:2])-> 50 bayt
bugmenot123
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.