Czy mój system operacyjny jest 32-bitowy czy 64-bitowy?


53

To już nie jest zbyt ważne, ale czasami ktoś musi wiedzieć.

Oto prosta gra w golfa: bez wkładu użytkownika, powiedz mi, czy komputer, na którym działa kod, jest w 64-bitowym systemie operacyjnym, czy w 32-bitowym systemie operacyjnym!

Jeśli kod jest uruchamiany w 32-bitowym systemie operacyjnym, wydrukuj „32”, jeśli kod jest uruchomiony w 64-bitowym systemie operacyjnym, wyślij „64”. Ważne: Wydrukuj dowolny inny niepusty ciąg znaków alfanumerycznych, jeśli nie jest on 32- lub 64-bitowy.

Należy pamiętać, że 32-bitowy program działający na komputerze z 64-bitowym systemem operacyjnym powinien wypisywać „64”. Możesz założyć, że użytkownicy będą używać 64-bitowego oprogramowania, gdy tylko będzie to możliwe.

Aby kwalifikować się do wpisu, kod musi być uruchomiony w systemie Windows 4.10 lub nowszym systemie Windows obsługiwanym przez Microsoft i co najmniej jednym wybranym systemie Linux (o ile ten smak jest bezpłatny). Mody kompatybilności mogą być instalowane, o ile program nadal zwraca prawidłową wartość.

Obowiązują zwykłe zasady .

Uwaga: jeśli twoja odpowiedź ma tylko wydrukować 32 lub 64, ale nie przypadek alt, zaakceptuję ją, ale nie jest to odpowiedź konkurencyjna.

Spróbuję opublikować później niektóre wyniki działania tych kodów w różnych systemach operacyjnych!


5
Tak więc „Należy pamiętać, że 32-bitowy program działający na komputerze z 64-bitowym systemem operacyjnym powinien wyświetlać„ 64 ”. Możesz założyć, że użytkownicy będą używać 64-bitowego oprogramowania, gdy tylko będzie to możliwe.” oznacza, że ​​jeśli interpreter / kompilator itp. jest dostępny zarówno w wersji 32-bitowej, jak i 64-bitowej, wówczas 32-bitowy system operacyjny zawsze będzie uruchamiał 32-bitową wersję interpretera / etc, a 64-bitowy system operacyjny zawsze będzie uruchamiał 64-bitowy interpreter /itp. Tak więc martwienie się o różnicę między programem 32 lub 64, a systemem operacyjnym 32 lub 64, jest w zasadzie tylko problemem dla języków z 32-bitowymi implementacjami. Dobrze?
Lyndon White

2
Wiele rozwiązań tutaj wypisuje „32” na 64-bitowym systemie operacyjnym, gdyby do kompilacji programu użyto kompilatora 32-bitowego. Czy to jest ok?
Martin Rosenau,

15
Czym na świecie jest „Windows 4.10”? Czy to oznacza Windows 98? Czy oznacza to Windows NT 4? Co uważasz za „nowsze” niż to? Wydaje się to wyjątkowo źle przemyślanym wyzwaniem.
Cody Gray

13
Nie ma „oficjalnej specyfikacji systemu Windows” i nikt nie odnosi się do systemu Windows 98 jako „Windows 4.10”. Jesteś dosłownie pierwszy. Może więc zamiast próbować brzmieć fajnie lub oficjalnie przy użyciu numerów wersji, powinieneś po prostu użyć rzeczywistej nazwy produktu . Nawiasem mówiąc, system Windows 9x nigdy nie był dostępny w wersji 64-bitowej, więc czy rzeczywiście mogę przesłać wpis, który działa tylko w systemie Windows 98 i zwraca tylko „32”? Wydaje się to bardzo niesprawiedliwe / niesportowe / nieciekawe, ale technicznie byłoby to dozwolone przez twoje zasady.
Cody Gray

3
Nadal nie odpowiedziałeś na pytanie dotyczące wersji systemu Windows. Czy musi być w stanie działać w systemie Windows 4.10 lub nowszym oznacza w systemie Windows 4.10 i wszystkich nowszych wersjach lub w dowolnej wersji systemu Windows 4.10 lub nowszej ?
Dennis

Odpowiedzi:


44

Montaż x86 (polyglot), 13 bajtów

Kod bajtowy:

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

Definiuje funkcję, która zwraca 32, jeśli interpretowana jest jako 32-bitowa, 64 jeśli 64-bitowa i 32767, jeśli 16-bitowa.

Chciałem stworzyć poliglota, który działałby w systemach Windows i Linux, ale jest to o wiele trudniejsze niż myślałem. Ponieważ nie jestem pewien, czy istnieje jakikolwiek sposób, aby wydrukować wartość w systemie Windows innym niż 16-bitowy bez łączenia.

Wyjaśnienie

Ten kod używa dwóch instrukcji, aby określić architekturę, na której działa. Pierwszą jest instrukcja 0x48 - na 16 i 32 bitach, to znaczy dec %eax, ale na 64 bitach jest to przedrostek wielkości instrukcji. Drugi komunikat jest tą samą instrukcją, jednak gdy wykonujemy go na wartości 0x8000, najbardziej znaczący bit jest odwracany tylko wtedy, gdy rozmiar rejestru wynosi 16 bitów, ustawiając flagę przepełnienia i pozwalając nam użyć jo.

W 16 bitach kod ten jest interpretowany następująco:

   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 */

W 32 bitach kod ten jest interpretowany następująco:

   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

W 64 bitach ten kod jest interpretowany następująco:

   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

To jest właściwie prawdopodobnie na czele, bardzo fajnie
tuskiomi

1
Bardzo fajny pomysł, ale po wdrożeniu zwróci nieprawidłową wartość, jeśli zostanie złożony jako 32-bitowy plik binarny i będzie działał w 64-bitowym systemie operacyjnym.
Cody Gray

@CodyGray z reguł: Możesz założyć, że użytkownicy będą używać 64-bitowego oprogramowania, gdy tylko będzie to możliwe. Przypuszczam, że oznacza to również, że dla funkcji możemy założyć, że kod dzwoniącego jest 64-bitowy, gdy tylko jest to możliwe.
Ruslan

Ach, przypuszczam, że to uczciwa interpretacja, @ Ruslan. Widzę , że opublikowałeś już odpowiedź, o której myślałem , gdyby nie ten problem. :-) Masz moje poparcie.
Cody Gray

czy bajt 48reprezentuje dec %eaxw trybie 16-bitowym?
phuclv

48

kod maszynowy x86, 12 bajtów

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

Nie golfowany:

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

Ta funkcja działa w systemie Linux, gdy jest używana w ELF32, zgodnie z SysV ABI i386, a także w Windows / Wine, gdy jest używana w PE32, zgodnie z stdcallkonwencją wywoływania.


W rzeczywistości można jeszcze bardziej zmniejszyć liczbę bajtów, stosując inne podejście .
Ruslan

co teoretycznie zrobiłby to w środowisku innym niż 32/64 bit?
tuskiomi

1
@tuskiomi W każdym razie ten kod nadal zwróci 32 lub 64. Jedyną różnicą w interpretacji tej sekwencji bajtów w trybie 16-bitowym będzie zmiana mnemoniki z eaxna ax. Tak więc, jeśli cszdarzy się , że selektor jest 0x23, wynikiem będzie 64, w przeciwnym razie 32.
Ruslan

wygląda to jednak specyficznie na dwa konkretne systemy operacyjne. Możesz łatwo mieć 32-bitowy system z cs = 0x23. Zamiast tego zobacz moją 8-bajtową odpowiedź, która zamiast tego dotyczy procesora.
Peter Ferrie

@peterferrie tak, dlatego mam inną odpowiedź . Ale twój przerosło go o 2 bajty.
Ruslan,

32

Mathematica, 17 bajtów

$SystemWordLength

13
Oczywiście jest wbudowany! \ s (+1)
tuskiomi

Czy nie należy dodawać &ani określać, że jest to w REPL?
LegionMammal978

5
@ LegionMammal978 „Jeśli kod działa w 32-bitowym systemie operacyjnym, wydrukuj„ 32 ”, jeśli kod jest uruchomiony w 64-bitowym systemie operacyjnym, wypisz„ 64 ”. Wydrukuj dowolny (inny) niepusty ciąg znaków alfanumerycznych jeśli to nie jest ”. Nie „zapewnia funkcji, która uruchamia to”; po prostu „zrób to”.
Patrick Stevens,

17
@PatrickStevens: jeśli pytanie nie określa, jaką formę powinno przyjąć zgłoszenie , domyślnie jest to program lub funkcja, ale nie fragment kodu .

3
@ ais523 Argumentowałbym, że w Mathematica nie ma rozróżnienia między programami, funkcjami i fragmentami. Wszystko jest tylko wyrazem.
ngenisis

21

Programy ładujące

Czy wiesz, że zarówno GRUB, jak i IPXE mają pełne języki programowania Turing dostępne w czasie wykonywania? Rodzina programów ładujących Syslinux nie, ale mogą to zrobić.

IPXE, 36 bajtów

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

pierwszy wiersz jest potrzebny, jeśli skrypt jest uruchamiany zdalnie, ale nie, jeśli zostanie wpisany bezpośrednio w wierszu polecenia.

GRUB, 42 bajty

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

Syslinux, 186 bajtów

To zajmuje trzy pliki. Pierwszy to syslinux.cfg (lub isolinux.cfg itp.).

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

i t.cfg

menu title 32

ans s.cfg

menu title 64

W tym przypadku najtrudniejsze jest to, że syslinux nie ma żadnych prostych możliwości wyświetlania tekstu, więc menu jest nadużywane.


Nie jestem pewien, czy potrafisz rozpoznać rozdzielczość systemu operacyjnego za pomocą programu ładującego, ale podoba mi się ten pomysł
tuskiomi

Sprawdza procesor i służy do wyboru odpowiedniego systemu operacyjnego. To jest po prostu golfowy kod z mojego unboot projektu.
hildred

2
Zmienia więc system operacyjny w oparciu o architekturę. Myśleć poza szablonowo. Lubię.
tuskiomi

Jaki jest bytecount?
Restioson

1
@hildred Wierzę, że byłoby bardziej czytelne, gdybyś użył ## iPXE, 36 byteszamiast### ipxe 36
NieDzejkob

21

Julia 14 13 bajtów

n->8sizeof(1)

Wyjaśnić:

  • Funkcja anonowa, przyjmowanie czegokolwiek (w tym nothing) zwracania liczby całkowitej 32 lub 64
  • Całkowitymi literałami są typu Int, które zależnie od tego czy 32-bitowe lub 64-bitowe, to albo Int32albo Int64(The 1może być dowolny cyfrowy)
  • umieszczenie liczby przed wywołaniem funkcji powoduje pomnożenie zestawienia
  • Jest to w zasadzie zminimalizowana wersja koduSys.WORD_SIZE używana w odpowiedzi rahnema1

Inną zabawną odpowiedzią jest ()->"$(Int)"[4:5], ale nie mogę odliczyć od tego.


-1 dzięki @Roman Gräf


Możesz użyć fałszywego argumentu: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

Julia, 20 17 16 bajtów

n->Sys.WORD_SIZE

* Dzięki @LyndonWhite zapisano 3 bajty * Dzięki @ RomanGräf zapisał bajt

Poprzednie odpowiedzi:

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

Wypróbuj online!


1
Ja osobiście lubię ten!
tuskiomi

2
Postępując zgodnie z konwencją: codegolf.meta.stackexchange.com/q/2419/62131 możesz ogolić 3 bajty, robiąc to()->Sys.WORD_SIZE
Lyndon White

1
Możesz również użyć fałszywego argumentu: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js), 24 bajty

_=>process.arch.slice(1)

Jest to funkcja i wraca '32', '64'lub jeśli nie 'rm'.


+1, ale przypuszczam, że 64-bitowy łuk może mieć 32-bitowy system operacyjny
Octopus

1
Daje mi „32” w 32-bitowym systemie Windows, więc wydaje się, że działa.
Ken YN

5
Możesz zgolić 7 bajtów, jeśli korzystasz z REPL i oszamiast process:os.arch().slice(1)
GilZ

Zwraca to architekturę systemu operacyjnego zgłoszoną do procesu, a nie faktyczną architekturę systemu operacyjnego. Więc to nie działa w systemie Linux. (Punch „setarch” w swojej ulubionej wyszukiwarce.)
David Schwartz

@DavidSchwartz działa dobrze na moim Linux-ie, chyba że się mylę, ale w PPCG możemy założyć niezmodyfikowane środowisko pod względem zmiany użytkownika przez użytkownika
Downgoat

13

C, 33 31 29 23 bajtów

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

Dzięki komentującym @ceilingcat i @Dennis za wskazówki dotyczące gry w golfa!


13
Mówi także, że obowiązują zwykłe reguły gry w golfa, a powrót z funkcji jest częścią naszych domyślnych ustawień we / wy.
Dennis

11
Czy to nie zależy od tego, czy kompilujesz jako program 32 czy 64-bitowy?
Ken YN

4
To nie jest zgodne z wymogami. „ Należy pamiętać, że 32-bitowy program działający na komputerze z 64-bitowym systemem operacyjnym powinien wypisywać„ 64 ”. ” To informuje, jak program został skompilowany, a nie jaki jest system operacyjny.
David Schwartz

2
@DavidSchwartz „Możesz założyć, że użytkownicy będą używać 64-bitowego oprogramowania, gdy tylko będzie to możliwe.”
Klas Lindbäck

2
Przykro mi to mówić, ale rozmiarof jest oceniany podczas kompilacji. Więc jeśli skompilujesz 32-bitowy plik exe i uruchomisz go na 64-bitowej maszynie, wyświetli on 32, a powinien wypisać 64 ( stackoverflow.com/questions/2615203/... ). Fajny pomysł!
Dinaiz

11

PowerShell, 16 bajtów

8*[IntPtr]::Size

Pobiera rozmiar wskaźnika w bajtach, mnoży przez 8, aby uzyskać bity.


-1 ponieważyour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r lub nowszy, nie i nowsze. Jestem gotów się założyć, że spora część tych odpowiedzi jest w najlepszym razie trudna do uruchomienia w długo nieobsługiwanej wersji systemu Windows. Nie można też oczekiwać od ludzi testowania na 98 wszystkich systemach operacyjnych - w dzisiejszych czasach nie jest nawet łatwa instalacja na maszynie wirtualnej (zaufaj mi, próbowałem. Nie będę działać na KVM i ma ciekawe interakcje z kartami graficznymi VBox) . (Ani nawet nie mają koncepcji 64-bit ... to wymóg naprawdę śmieszne.)
Bob

1
@ ub3rst4r Wątpię, czy wszystkie interpretowane języki programowania mają implementację działającą w systemie Windows 4.10!
Martin Rosenau,

1
Wygląda na to, że zawiedzie, jeśli jest to 32-bitowy PowerShell w 64-bitowym systemie operacyjnym.
Chris J

@ChrisJ Przynajmniej w Win10 i Win2012 R2 zwraca poprawny wynik z PowerShell x86. Nie testowałem na Linuksie.
Booga Roo

10

Python 2, 52, 48, 42 41 bajtów

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

Dzięki totalnie ludzkiemu!


Powiększenie! przez linię w niecałą minutę.
tuskiomi

Zamierzam wstrzymać się z testowaniem tego, dopóki nie wrócę do domu, ale nie jestem pewien, czy to wypisze „32” i „64”, ale w innych przypadkach jestem pewien.
tuskiomi

@tuskiomi, to drukuje „32bit” lub „64bit”
Daniel

1
from struct import*;print calcsize("P")*8jest krótszy.
całkowicieludzki

12
Jeśli uruchomisz to na 32-bitowym Pythonie w 64-bitowym systemie operacyjnym, myślę, że to cię okłamie. Większość innych odpowiedzi wydaje się i tak na to wrażliwa ...
Nick T

10

Java 8, 45 bajtów

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

@Dopapp Co to znaczy, że jest to fragment kodu, a nie program lub funkcja. W Javie 8 powinno to działać:n=>System.getProperty("os.arch")
NoOneIsHere

@NoOneIsHere, oh dziękuję, że poszło mi ponad głową
Daniel

2
„Jeśli kod jest uruchamiany w 32-bitowym systemie operacyjnym, wypisz„ 32 ”, jeśli kod jest uruchamiany w 64-bitowym systemie operacyjnym, wypisz„ 64 ”. Wydrukuj dowolny (inny) niepusty ciąg znaków alfanumerycznych, jeśli jest ani.". To wcale tak nie robi ...
Olivier Grégoire,

4
Czy możesz pobrać Javę 8 dla Windows 98 (v4.10)?
TessellatingHeckler

4
@TessellatingHeckler Java 8 wymaga „i586” (cokolwiek to oznacza). Wpis brzmi: „Twój kod musi działać w systemie Windows 4.10 lub nowszym”, a nie „Twój kod musi działać w systemie Windows 4.10 i nowszym”. Działa na nowszym systemie Windows .
Olivier Grégoire,


8

Windows CMD, 56 52 bajtów (dzięki Bob!)

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

Wciąż zaskakująco długie - jak dotąd najdłuższe!


1
Właściwie %windir%\SysWOW64jest jeszcze krótszy, tak myślę ...
Bob

7
musi być w stanie uruchomić system Windows 4.10 lub nowszy i przynajmniej jeden smak Linuksa, który wybierzesz ” - który smak Linuxa w tym celu?
TessellatingHeckler

1
@TessellatingHeckler, jeśli zainstalujesz Wine ...?
Ken YN

1
A co z używaniem stenografii? if EXIST "c:\Progra~3" (echo 64)else echo 32Domyślnie masz ProgramDatai Program Filestak jeśli jedna trzecia istnieje, powinniśmy być 64
Marie

3
Co to wydrukuje dla 8-bitowego systemu operacyjnego?
tuskiomi

7

C, Win32 API, 103 183 bajtów

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

W rzeczywistości są tutaj więcej niż 2 przypadki. Sprawdźmy je

  • Najłatwiejszy: IsWow64Processnie istnieje: mamy 32-bitowy system operacyjny

W następnych dwóch przypadkach musimy mieć wiedzę, że nasz plik binarny będzie 32-bitowym plikiem wykonywalnym. I ten opis tego, co będzie w parametrze outIsWow64Process

Wskaźnik do wartości ustawionej na PRAWDA, jeśli proces działa pod WOW64. Jeśli proces działa w 32-bitowym systemie Windows, wartość jest ustawiona na FAŁSZ. Jeśli proces jest 64-bitową aplikacją działającą w 64-bitowym systemie Windows, wartość jest również ustawiona na FAŁSZ.

Pozostają nam dwa dodatkowe przypadki:

  • IsWow64Process istnieje i daje PRAWDA -> Jesteśmy na komputerze 64-bitowym
  • IsWow64Process istnieje i daje FAŁSZ -> Jesteśmy na maszynie 32-bitowej

Nie przejmujemy się częścią, w której 64-bitowa aplikacja w 64-bitowym systemie Windows daje FALSE. Jak wiemy , nasza aplikacja jest 32-bitowa

Aha, jest jeszcze jeden dodatkowy przypadek, który nie jest objęty tym wyzwaniem i i tak powinien być rzadki:

  • IsWow64Process istnieje, ale się nie udaje: domyślnie mamy 32-bitową maszynę.

Powinno to obejmować większość systemów operacyjnych Windows NT. Testowałem tylko na Win10 64-Bit, Win 7 64-Bit, Win 8.1 32-Bit i WinXP SP1 32-Bit


Oryginalna odpowiedź:

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

Aby mieć pewność, musimy rozróżnić tylko 2 przypadki

  • IsWow64Process nie istnieje w kernel32.dll => Jesteśmy na komputerze 32-bitowym.

  • IsWow64Process istnieje => Jesteśmy na komputerze 64-bitowym.

Rzeczywista wartość podana przez IsWow64Processjest nieistotna dla tego wyzwania, ponieważ chcemy, aby plik binarny był w każdym razie 32-bitowy.

W przeciwieństwie do większości odpowiedzi, nie zależy to od kompilacji samego pliku binarnego na maszynie, na której jest wykonywany.

Gdybym znał krótszą funkcję, która jest obecna tylko na maszynach 64-bitowych, a nie 32-bitowych, mógłbym skrócić odpowiedź.


2
Upuść .dllz ciągu nazwy modułu. Jest to nie tylko dobre do gry w golfa, ale jest też lepszą praktyką podczas normalnego użytkowania. Ponadto, do celów golfowych, możesz porzucić miejsce #include.
Cody Gray

Dzięki, naprawdę chciałem zredukować całość, po prostu szukając modułu, który można znaleźć na 64-bitowym, ale nie na 32-bitowym. Ciagle szukam. Niestety (w tym celu) nie ma modułu o nazwie WoW64.
MrPaulch

Tak naprawdę jest wow64.dlli Wow64Win.dll, ale nigdy nie próbowałem z nimi dzwonić GetModuleHandle. Problem polega jednak na tym, że byłyby ładowane tylko dla procesu 32-bitowego uruchomionego na komputerze 64-bitowym, a nie dla procesu 64-bitowego uruchomionego na komputerze 64-bitowym.
Cody Gray

Mam. Zwracają 0 nawet na 64-bitowej maszynie. Właściwie to ma sens. Nie istnieją, aby być z nimi bezpośrednio połączonymi. System dba o przekierowanie w czasie wykonywania.
MrPaulch

Och, problem jednak. Z dokumentacji SDK: „Zauważ, że ta technika nie jest niezawodnym sposobem na wykrycie, czy system operacyjny jest 64-bitową wersją systemu Windows, ponieważ Kernel32.dll w obecnych wersjach 32-bitowego systemu Windows również zawiera tę funkcję”.
Cody Gray

7

C #, 60 50 bajtów

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

Dzięki @TheLethalCoder


1
Witamy na stronie! :)
DJMcMayhem

4
Zaoszczędź 4 bajty, jeśli usuniesz „Linia”
John

1
można również usunąć „Środowisko”. i „konsola”. przy założeniu użycia using static System.Environment;iusing static System.Console;
John

1
także zmień WriteLinenaWrite
Thomas Ayoub,

7
@John Kiedy ostatnio sprawdzałem, import musi być uwzględniony, a więc zwiększyłby liczbę bajtów
Ceshion

6

Ruby, 22 bajty

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

["any string"].pack("p")zwraca ciąg, którego bajty odpowiadają wskaźnikowi skierowanemu w stronę "any string", i ma 8 znaków, jeśli system operacyjny jest 64-bitowy, lub 4 znaki, jeśli system operacyjny jest 32-bitowy.


Ponieważ używa to rozmiaru wskaźnika, to wypisuje 32-bit, gdy interpreter Ruby jest 32-bitowym plikiem binarnym w 64-bitowym systemie operacyjnym. Więc nie przestrzega reguły.
DarkDust,

1
@DarkDust You can assume that users will use 64 bit software whenever possible.Tak więc zakłada się, że 64-bitowi użytkownicy używają 64-bitowego Ruby.
Wartość tuszu

6

R, 16 bajtów

.Machine[[18]]*8

Zwraca rozmiar wskaźnika.


1
Podobnie jak wszystkie rozwiązania wielkości wskaźnika, spowoduje to wydrukowanie niewłaściwego wyniku, gdy program jest 32-bitowym plikiem binarnym działającym w 64-bitowym systemie operacyjnym.
DarkDust,

1
@DarkDust R jest interpretowany i możemy założyć, że użytkownik używa 64-bitowego oprogramowania, jeśli to możliwe, a więc także 64-bitowego interpretera. IMHO, reguła dotyczy tylko skompilowanych języków
NieDzejkob

@NieDzejkob To jest dokładnie ta sama logika, której użyłem dla mojej odpowiedzi w PHP, kiedy ktoś inny umieścił ten sam typ komentarza w odpowiedzi na moją odpowiedź, chciałbym, aby inni przeczytali to samo z pytania, jak przy założeniu, że użytkownicy będą używać 64- w miarę możliwości oprogramowanie bitowe z tłumaczonymi językami.
Bja

6

Perl, 18 15 18 bajtów

say length pack p8

Wchodzę 64␤na mój 32-bitowy komputer, ponieważ perlzostał zbudowany z 64-bitową wersją IV. Zazwyczaj dzieje się tak w przypadku 32-bitowej wersji systemu Windows.
Brad Gilbert b2gills

@ BradGilbertb2gills Przywróciłem kod do poprzedniej wersji; ten powinien działać nawet w tym przypadku. Daj mi znać, jeśli nadal nie działa, usunę moją odpowiedź.
Grimmy,

1
To działa poprawnie.
Brad Gilbert b2gills

Wydaje się zły na HP 9000/785. Daje 32. Ale nie sądzę, żeby były jakieś 32-bitowe procesory HP / PA-RISC.
Ole Tange

6

kod maszynowy x86, 8 bajtów

31 C0 B0 40 48 24 60 C3

Nie golfowany:

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

Jeśli jest skompilowany jako 64-bitowy plik wykonywalny, zwraca 64 eax, a jeśli jest skompilowany jako 32-bit, zwraca 32 - niezależnie od systemu operacyjnego.

Ta odpowiedź opiera się na zasadach mówiących:

Możesz założyć, że użytkownicy będą używać 64-bitowego oprogramowania, gdy tylko będzie to możliwe.


Chociaż jest to interesujące podejście, jak można je zapisać w programie w taki sposób, aby można je było faktycznie wykonać? Każda metoda wykonania kodu binarnego, inna niż napisanie własnej funkcji modułu ładującego, korzysta z plików specyficznych dla kodu 64-bitowego lub 32-bitowego. Dlatego potrzebujesz dwóch kopii tego kodu, aby faktycznie uruchomić ...
Jules

@Jules Możesz umieścić go jako zestaw wbudowany w programie języka wysokiego poziomu, tak jak tutaj . Następnie wystarczy użyć kompilatora natywnego dla platformy z domyślnymi opcjami, a uzyskasz bitowość.
Ruslan

@ l4m2 dlaczego na mnie krzyczysz? Ale i tak masz rację, te dwa bajty wydają się być śmieciami z moich eksperymentów. Usunie.
Ruslan,

5

PHP, 18 bajtów

<?=PHP_INT_SIZE*8;

To poprawnie obsługuje wszystkie przypadki procesorów 32, 64 i innych bitów, pod warunkiem, że PHP_INT_SIZE jest poprawne, pokaże dokładny rozmiar procesora bez względu na procesor na którym działa PHP!

Jeśli PHP działa

32-bitowy system operacyjny PHP_INT_SIZE == 4,

64-bitowy system operacyjny PHP_INT_SIZE == 8,

16-bitowy system operacyjny PHP_INT_SIZE == 2 (teoretycznie)

8-bitowy system operacyjny PHP_INT_SIZE == 1 (ponownie teoretycznie)

128-bitowy system operacyjny PHP_INT_SIZE == 16 (Jeszcze nie osiągnięty, ale możliwy)


2
ta stała ma rozmiar systemu operacyjnego, w którym zbudowano PHP, a nie uruchomiono
Einacio

2
@Einacio Tak, ale w początkowym wyzwaniu plakat napisał: „Możesz założyć, że użytkownicy będą używać 64-bitowego oprogramowania, jeśli to możliwe”, dlatego jeśli system operacyjny jest 64-bitowy, to należy założyć, że wersja PHP działająca w systemie operacyjnym być 64-bitowym! (Uwaga: nie widzę w tym luki tylko czystej logiki opartej na początkowym wyzwaniu.)
Bja

4

C # (29 bajtów)

Console.Write(IntPtr.Size*8);

10
Podobnie jak wszystkie rozwiązania wielkości wskaźnika, spowoduje to wydrukowanie niewłaściwego wyniku, gdy program jest 32-bitowym plikiem binarnym działającym w 64-bitowym systemie operacyjnym.
DarkDust,

1
Musisz określić, że jest to kompilowane dla „AnyCPU” z niezaznaczonym polem wyboru „Preferuj 32-bit”.
Cody Gray

4

PowerShell, 17 52 bajty

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

Zwraca 64, jeśli spełniony jest jeden z poniższych warunków:

  • Na bieżącym dysku znajduje się katalog z nazwą pliku kończącą się na paren, którego celem jest wykrycie Program Files (x86).
  • archzwraca ciąg znaków kończący się na 4(ASCII 52), na przykład x86_64, w przeciwieństwie do np i686.

Try-catch ma na celu obejście błędu, który otrzymujesz, jeśli gci nic nie zwraca i nie masz łuku . Do tej pory nie znalazłem krótszego sposobu. gci jest używany przez ls, ponieważ w Linuksie ls spowoduje widoczny błąd.

Ta wersja powinna wykryć, czy system operacyjny jest 64-bitowy, a nie tylko PowerShell, i jest testowana do pracy w systemach Windows i Linux. Dla wsparcia Mac, wymienić archz uname -m.

Poprzednia wersja tylko dla systemu Windows: -!(ls \*`))*32+64


na jakiej dystrybucji Linuksa to działa?
tuskiomi

@tuskiomi Oh, my bad - rozumiem, co masz na myśli. Nie przeczytałem poprawnie wyzwania. Czy powinienem usunąć odpowiedź?
Andy C.,

Jeśli wiesz, że będzie działać z WINE, powinieneś go zachować.
tuskiomi

@tuskiomi Przynajmniej Ubuntu 14.04, 16.04, RHEL7, CentOS7 i niektóre wersje SUSE: github.com/PowerShell/PowerShell/releases
Xudonax

4

Swift 4 REPL / Playground, 12 bajtów

Int.bitWidth

Intma wielkość słowa, działając jak jeden Int32lub w Int64zależności od systemu.


Czy to nie jest wycinek kodu, więc powinien wydrukować? A może powiedzenie, że korzystasz z REPL, pozwala ominąć to ograniczenie?
Lyndon White

1
To zależy od sędziów. Korzystanie z REPL nie jest bardzo powszechne, ale Swift Playgrounds są bardzo popularne (szczególnie na iPadzie). Osobiście uważam, że to uczciwa gra. Ludzie projektują niestandardowe języki programowania do gry w golfa, które domyślnie drukują wartości, ale to nie jest inaczej
Alexander

4

Rubinowy, 10 bajtów

p 0.size*8

Podczas gdy Ruby może używać liczb całkowitych o dowolnej długości, wewnętrznie przechowuje wartości pasujące do słowa maszynowego jako Fixnum. Metoda Fixnum#sizezawsze zwraca długość w bajtach słowa maszynowego.

FixnumKlasa została usunięta w Ruby 2.4.0, jego funkcjonalność została ujęta w klasie Integer. Kod stoi.


4

Shell, 26 bajtów

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

Możesz użyć archzamiast uname -m.
Dennis

1
@Dennis Niekoniecznie. Na komputerach Mac: uname -m-> x86_64, ale arch-> i386. Ponieważ macos :( Jest to również specyficzne dla bash - nie działa na zsh.
viraptor

@StevenPenny zshspróbuje zinterpretować ?symbol wieloznaczny glob / pojedynczy znak.
Klamka

Czy to działa w systemie Windows?
Ajasja

1
@Ajasja with Cygwin
Steven Penny

4

Bash, 25 17 bajtów

getconf LONG_BIT

Podziękowania dla Dennisa za pomoc w grze w golfa.


4

C, 22 bajty

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

Jest to odpowiedź oparta na rozmiarze wskaźnika, która zakłada natywny plik binarny. Przesyłany 0jest na int**(adres 0x0). Następnie dodajemy 8 do 0, co w C przesuwa wskaźnik o sizeof(int*)*8. 4 bajty * 8 bitów = 32, 8 bajtów * 8 bitów = 64. Tak więc otrzymujemy (int**)0x20i 0x40które są następnie domyślnie rzutowane jako liczby całkowite, zwracając je z funkcji niejawnie intzwracającej.

C, autonomiczny, 34 bajty

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

C, zabawa z Unicode, 30 punktów kodowych, 34 bajty (UTF-8)

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

Próbowałem zrozumieć, jak to działa, ale nie mam pojęcia. Czy możesz dodać wyjaśnienie?
NieDzejkob

@jbcreix clever ...
NieDzejkob

3

Java, 50 bajtów

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


Czy to jest biblioteka? Jeśli tak, powinieneś o tym wspomnieć! Nie widzę jednak tej klasy dostępnej w JDK 8 Oracle (nie mam do dyspozycji moich zwykłych JDK 6 i 7, bankomat).
Olivier Grégoire,

2
Ta odpowiedź jest nieprawidłowa. Nie drukuje się.
Philipp

6
Cytując Dennisa:> Mówi także, że obowiązują zwykłe reguły gry w golfa, a powrót z funkcji jest częścią naszych domyślnych ustawień we / wy.
Asu

Zmień go na funkcję Lamba dla mniejszej ilości bajtów:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig,

3

PHP, 29 bajtów

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

https://3v4l.org/Y6JXv


Och Ten mi się podoba. Jak to działa?
tuskiomi

4
php_uname('m')zwraca x86_64w 64-bitowym systemie operacyjnym, w przeciwnym razie coś takiego i386. 4będąc 6th charakter (5 0 indeksowane) łańcucha, '4' - 4 == 0 == false. I @po prostu tłumi ostrzeżenia dla niecytowanych ciągów i niezainicjowanych przesunięć.
Petah,

2
To wykrywa architekturę PHP, a nie systemu operacyjnego. Używam 32-bitowego PHP na 64-bitowym systemie Windows, php_uname('m')zwraca 'i586'.
Gras Double

@GrasDouble well Myślę, że ymmv, pracuję dla mnie z Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah

1
@tuskiomi to wydrukuje 64, jeśli istnieje 8-bitowy system operacyjny
Bja

3

Python 3 , 77 84 71 59 bajtów

-13 bajtów, dzięki @JonathanAllan!
Do 59 autorstwa @Clearer

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

Wypróbuj online!

Mój pierwszy kod w golfa :)
Powinien wyświetlać poprawną wersję, nawet jeśli działa 32-bitowy Python na 64-bitowym systemie operacyjnym.
Zakładając, że platform.machine()daje i*86lub x86dla 32-bitowego systemu operacyjnego. Nie mam jednego, żeby to sprawdzić. Dane wyjściowe są 0wtedy, gdy system operacyjny nie jest w wersji 64 / 32Bit
Edytuj: Dodano instrukcję wydruku, więc ma 7 bajtów więcej


Nie jestem pewien, czy jest to dopuszczalne, ponieważ możliwe jest uruchomienie 32-bitowego systemu operacyjnego na komputerze 64-bitowym (lub mieć jakiś komputer o nazwie foo8664-bitowy: p), ale jeśli jest to dopuszczalne, możesz zapisać 9 (edytować .. .13!) Bajtów z print((a==64)*a+32*(a==86)).
Jonathan Allan,

from platform import*;print({'4':64,'6':32}[machine()[-1]])też by działał.
Jaśniejsze

@Clearer Pominąłoby to następujące ograniczenie: Ważne: Wydrukuj dowolny inny niepusty ciąg znaków alfanumerycznych, jeśli nie jest on 32- lub 64-bitowy. .
TOMAT

@tOmAtE, jeśli nie jest 32-bitowy ani 64-bitowy, zgłosi wyjątek, który wypisuje niepusty ciąg.
Jaśniejsze

2
Spróbuj architektury (), zapisuje dykt: from platform import*;print(architecture()[0][:2])-> 50 bajtów
bugmenot123
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.