Es ist nicht mehr so wichtig, aber gelegentlich muss es jemand wissen.
Hier ist ein einfaches Beispiel: Sagen Sie mir ohne Benutzereingabe, ob der Computer, auf dem der Code ausgeführt wird, ein 64-Bit-Betriebssystem oder ein 32-Bit-Betriebssystem ist!
Wenn der Code auf einem 32-Bit-Betriebssystem ausgeführt wird, geben Sie "32" aus. Wenn der Code auf einem 64-Bit-Betriebssystem ausgeführt wird, geben Sie "64" aus. Wichtig: Drucken Sie eine beliebige andere nicht leere Zeichenfolge aus alphanumerischen Zeichen, wenn es sich nicht um 32- oder 64-Bit handelt.
Bitte beachten Sie, dass ein 32-Bit-Programm, das auf einem Computer mit einem 64-Bit-Betriebssystem ausgeführt wird, "64" ausgeben sollte. Sie können davon ausgehen, dass Benutzer nach Möglichkeit 64-Bit-Software verwenden.
Um zur Teilnahme berechtigt zu sein, muss Ihr Code auf Windows 4.10 oder neueren von Microsoft unterstützten Windows-Systemen und mindestens einer Linux-Version Ihrer Wahl ausgeführt werden können (sofern diese Version kostenlos ist). Kompatibilitätsmods können installiert werden, solange das Programm noch den richtigen Wert zurückgibt.
Es gelten die üblichen Code-Golf- Regeln.
Hinweis: Wenn Ihre Antwort nur zum Ausdrucken von 32 oder 64 gedacht ist, nicht jedoch für den Alternativfall, akzeptiere ich sie, aber es handelt sich nicht um eine konkurrierende Antwort.
Ich werde später versuchen, einige Ergebnisse der Ausführung dieser Codes auf verschiedenen Betriebssystemen zu veröffentlichen!
quelle
Antworten:
x86-Assembly (mehrsprachig), 13 Byte
Bytecode:
Definiert eine Funktion, die 32 zurückgibt, wenn sie als 32-Bit, 64, wenn 64-Bit und 32767, wenn 16-Bit interpretiert wird.
Ich wollte einen Polyglot machen, der unter Windows und Linux lief, aber das ist viel schwieriger als ich dachte. Da ich nicht sicher bin, ob es überhaupt eine Möglichkeit gibt, einen Wert unter Nicht-16-Bit-Windows ohne Verknüpfung zu drucken.
Erläuterung
Dieser Code verwendet zwei Tells, um die Architektur zu bestimmen, auf der er ausgeführt wird. Der erste ist der Befehl 0x48 - bei 16 und 32 Bit ist dies der Fall
dec %eax
, bei 64 Bit handelt es sich jedoch um ein Präfix der Befehlsgröße . Der zweite Befehl ist derselbe. Wenn wir ihn jedoch auf dem Wert 0x8000 ausführen, wird das höchstwertige Bit nur dann umgedreht, wenn die Registergröße 16 Bit beträgt, wodurch das Überlaufflag gesetzt und die Verwendung zugelassen wirdjo
.In 16 Bits wird dieser Code wie folgt interpretiert:
In 32 Bit wird dieser Code wie folgt interpretiert:
In 64 Bit wird dieser Code wie folgt interpretiert:
quelle
48
repräsentiertdec %eax
in 16-Bit - Modus?x86-Maschinencode, 12 Byte
Ungolfed:
Diese Funktion funktioniert unter Linux unter ELF32 nach i386 SysV ABI sowie unter Windows / Wine unter PE32 nach
stdcall
Aufruf der Konvention.quelle
eax
nachax
. Also, wenn der Selektorcs
zufällig ist0x23
, wird das Ergebnis 64 sein, sonst 32.Mathematica, 17 Bytes
quelle
&
oder angeben, dass dies in der REPL steht?Bootloader
Wussten Sie, dass sowohl bei GRUB als auch bei IPXE die vollständigen Programmiersprachen von Turing zur Laufzeit verfügbar sind? Die Syslinux-Familie von Bootloadern kann dies jedoch nicht.
IPXE, 36 Byte
Die erste Zeile wird benötigt, wenn das Skript remote ausgeführt wird, jedoch nicht, wenn es direkt in der Befehlszeile eingegeben wird.
GRUB, 42 Bytes
Syslinux, 186 Bytes
Das braucht drei Dateien, die erste ist syslinux.cfg (oder isolinux.cfg usw.).
und t.cfg
ans an cfg
In diesem Fall ist der schwierige Teil, dass Syslinux keine einfachen Textanzeigefunktionen hat, sodass das Menü missbraucht wird.
quelle
## iPXE, 36 bytes
anstelle von### ipxe 36
Julia
1413 BytesErklären:
nothing
) annimmt, was eine Ganzzahl von 32 oder 64 zurückgibtInt
, je nachdem, ob es sich bei 32-Bit- oder 64-Bit- Literalen um einInt32
oder ein Bit handeltInt64
(das1
kann eine beliebige Ziffer sein).Sys.WORD_SIZE
, der in der Antwort von rahnema1 verwendet wirdEine andere lustige Antwort ist
()->"$(Int)"[4:5]
, aber ich kann den Countdown für diese nicht abrufen.-1 danke an @Roman Gräf
quelle
julia,
201716 bytes* Dank @LyndonWhite wurden 3 Bytes gespeichert * Dank @ RomanGräf wurde ein Byte gespeichert
Bisherige Antworten:
Probieren Sie es online!
quelle
()->Sys.WORD_SIZE
JavaScript (Node.js), 24 Byte
Dies ist eine Funktion und kehrt
'32'
,'64'
oder wenn weder'rm'
.quelle
os
anstelle vonprocess
:os.arch().slice(1)
C
33312923 BytesVielen Dank an die Kommentatoren @ceilingcat und @Dennis für die Golftipps!
quelle
PowerShell, 16 Byte
Ruft die Zeigergröße in Byte ab und multipliziert sie mit 8, um Bits zu erhalten.
quelle
your code must be able to run on Windows 4.10 or newer
Python 2,
52, 48, 42,41 BytesDanke an totalhuman!
quelle
from struct import*;print calcsize("P")*8
ist kürzer.Java 8, 45 Bytes
quelle
n=>System.getProperty("os.arch")
Perl 6 , 17 Bytes
Versuch es
Es gibt eine Verwandte,
$?BITS
die die Anzahl der Bits enthält, die ein Nativeint
in der Laufzeit hat.Versuch es
quelle
Windows CMD,
5652 Bytes (danke Bob!)Immer noch überraschend lang - bis jetzt am längsten!
quelle
%windir%\SysWOW64
ist es sogar noch kürzer, denke ich ...if EXIST "c:\Progra~3" (echo 64)else echo 32
Standardmäßig haben SieProgramData
undProgram Files
wenn ein dritter vorhanden ist, sollten wir 64 seinC, Win32 API,
103183 BytesEigentlich gibt es hier mehr als 2 Fälle. Untersuchen wir sie
IsWow64Process
existiert nicht: Wir arbeiten mit einem 32-Bit-BetriebssystemFür die nächsten beiden Fälle müssen wir wissen, dass unsere Binärdatei eine 32-Bit-ausführbare Datei sein wird. Und diese Beschreibung dessen, was in den out- Parameter von ausgegeben wird
IsWow64Process
Das lässt uns mit zwei zusätzlichen Fällen:
IsWow64Process
existiert und ergibt WAHR -> Wir sind auf einer 64-Bit-MaschineIsWow64Process
existiert und ergibt FALSE -> Wir sind auf einer 32-Bit-MaschineWir sind nicht besorgt über den Teil, in dem eine 64-Bit-Anwendung auf einem 64-Bit-Windows FALSE ergibt. Wie wir wissen dass unsere Anwendung 32-Bit ist
Oh, und es gibt noch einen weiteren Fall, der von dieser Herausforderung nicht abgedeckt wird und auf jeden Fall selten sein sollte:
Dies sollte die meisten Windows NT-Betriebssysteme abdecken. Habe nur auf Win10 64-Bit, Win7 64-Bit, Win 8.1 32-Bit und WinXP SP1 32-Bit getestet
Ursprüngliche Antwort:
Um sicherzugehen, müssen wir nur 2 Fälle unterscheiden
IsWow64Process
existiert nicht in kernel32.dll => Wir sind auf einer 32-Bit-Maschine.IsWow64Process
existiert => Wir sind auf einer 64-Bit-Maschine.Der tatsächliche Wert von
IsWow64Process
ist für diese Herausforderung unerheblich, da die Binärdatei auf jeden Fall 32 Bit sein soll.Im Gegensatz zu den meisten Antworten hängt dies nicht davon ab, dass die Binärdatei selbst auf dem Computer kompiliert wird, auf dem sie ausgeführt wird.
Wenn ich eine kürzere Funktion kennen würde, die nur auf 64-Bit- und nicht auf 32-Bit-Computern verfügbar ist, könnte ich die Antwort verkürzen.
quelle
.dll
Zeichenfolge aus dem Modulnamen. Dies ist nicht nur gut zum Golfen, sondern es ist auch eine bessere Übung im normalen Gebrauch. Zum Golfen können Sie auch das Leerzeichen nachher ablegen#include
.wow64.dll
undWow64Win.dll
, aber ich habe noch nie versucht,GetModuleHandle
mit denen anzurufen . Das Problem ist jedoch, dass sie nur für einen 32-Bit-Prozess geladen werden, der auf einem 64-Bit-Computer ausgeführt wird, nicht für einen 64-Bit-Prozess, der auf einem 64-Bit-Computer ausgeführt wird.C #,
60-50BytesDanke @TheLethalCoder
quelle
using static System.Environment;
undusing static System.Console;
WriteLine
zuWrite
Ruby, 22 Bytes
["any string"].pack("p")
Gibt eine Zeichenfolge zurück, deren Bytes dem Zeiger entsprechen, auf den gezeigt"any string"
wird. Bei einem 64-Bit-Betriebssystem sind es 8 Zeichen, bei einem 32-Bit-Betriebssystem 4 Zeichen.quelle
You can assume that users will use 64 bit software whenever possible.
wird also angenommen, dass 64-Bit-Benutzer 64-Bit-Ruby ausführen .R, 16 Bytes
Gibt die Zeigergröße zurück.
quelle
Perl,
181518 Bytesquelle
64
auf meinem 32 Bit Computer, weilperl
mit einem 64 Bit IV gebaut wurde. Dies ist normalerweise der Fall, wenn Sie mit einer 32-Bit-Version von Windows arbeiten.x86-Maschinencode, 8 Byte
Ungolfed:
Wenn es als ausführbare 64-Bit-Datei kompiliert wird, gibt es 64 Zoll zurück
eax
. Wenn es als 32-Bit kompiliert wird, gibt es 32 zurück - unabhängig vom Betriebssystem.Diese Antwort basiert auf den Regeln:
quelle
PHP, 18 Bytes
Damit werden alle Fälle von 32-, 64- und anderen Bit-CPUs korrekt behandelt. Vorausgesetzt, PHP_INT_SIZE ist korrekt, wird die genaue Größe der CPU angezeigt, unabhängig davon, auf welcher CPU PHP ausgeführt wird!
Wenn PHP läuft
32-Bit-Betriebssystem PHP_INT_SIZE == 4,
64-Bit-Betriebssystem PHP_INT_SIZE == 8,
16-Bit-Betriebssystem PHP_INT_SIZE == 2 (theoretisch)
8-Bit-Betriebssystem PHP_INT_SIZE == 1 (wieder theoretisch)
128-Bit-Betriebssystem PHP_INT_SIZE == 16 (noch nicht erreicht, aber möglich)
quelle
C # (29 Bytes)
quelle
Power Shell,
1752 BytesGibt 64 zurück, wenn eine der folgenden Bedingungen erfüllt ist:
Program Files (x86)
.arch
gibt einen String zurück, der mit4
(ASCII 52) endet , wiex86_64
im Gegensatz zu zi686
.Der Try-Catch soll den Fehler umgehen, den Sie erhalten, wenn gci nichts zurückgibt und Sie keinen Bogen haben . Ich habe bisher keinen kürzeren Weg gefunden. GCI wird verwendet , über ls weil auf Linux, ls einen sichtbaren Fehler produzieren.
Diese Version sollte erkennen, ob das Betriebssystem 64-Bit ist und nicht nur PowerShell. Es wurde getestet, um unter Windows und Linux zu funktionieren. Für Mac - Unterstützung, ersetzen
arch
mituname -m
.Vorherige Nur-Windows-Version:
-!(ls \*`))*32+64
quelle
Swift 4 REPL / Playground, 12 Bytes
Int
ist wortgroß und verhält sich entweder wieInt32
oderInt64
abhängig vom System.quelle
Ruby, 10 Bytes
Ruby kann zwar Ganzzahlen beliebiger Länge verwenden, speichert jedoch intern die Werte, die in ein Maschinenwort passen, als
Fixnum
. Die Methode liefertFixnum#size
immer die Länge eines Maschinenwortes in Bytes.Die
Fixnum
Klasse wurde in Ruby 2.4.0 entfernt, ihre Funktionalität wurde in die Klasse aufgenommenInteger
. Der Code steht.quelle
Shell, 26 Bytes
quelle
arch
anstelle von verwendenuname -m
.uname -m
->x86_64
, aberarch
->i386
. Denn macos :( Auch dies ist bash-spezifisch - schlägt auf zsh fehl.zsh
wird versuchen, den?
Platzhalter als Glob / Einzelzeichen zu interpretieren .Bash,
2517 BytesVielen Dank an Dennis für die Golfhilfe.
quelle
C, 22 Bytes
Dies ist eine auf der Zeigergröße basierende Antwort, die eine native Binärdatei voraussetzt. Das
0
ist gegossen anint**
(Adresse0x0
). Dann addieren wir 8 zu 0, was in C den Zeiger um vorrücktsizeof(int*)*8
. 4 Bytes * 8 Bits = 32, 8 Bytes * 8 Bits = 64. Also bekommen wir(int**)0x20
und0x40
die werden dann implizit als ganze Zahlen umgewandelt, indem sie von einem implizit zurückgegeben werdenint
zurückgegebenen Funktion zurückgegeben werden.C, eigenständig, 34 Bytes
C, Spaß mit Unicode, 30 Code-Punkte, 34 Bytes (UTF-8)
quelle
Java, 50 Bytes
quelle
()->com.sun.jna.Native.POINTER_SIZE*8
PHP, 29 Bytes
https://3v4l.org/Y6JXv
quelle
php_uname('m')
kehrtx86_64
auf einem 64 bit OS zurück, ansonsten sowasi386
.4
wobei es sich um das sechste Zeichen (mit dem Index 5: 0) der Zeichenfolge handelt'4' - 4 == 0 == false
,. Und@
unterdrückt nur Warnungen für nicht notierte Strings und uninitialised Offsets.php_uname('m')
gibt'i586'
.Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64
.Python 3 ,
77847159 Bytes-13 Bytes, danke an JonathanAllan!
Bis auf 59 von @Clearer
Probieren Sie es online!
Mein erstes Mal Code-Golfen :)
Sollte die richtige Version ausgeben, auch wenn 32Bit-Python auf 64bit-OS läuft.
Vorausgesetzt es
platform.machine()
gibti*86
oderx86
für 32Bit-OS. Ich habe keine, um dies zu überprüfen. Die Ausgabe erfolgt,0
wenn das Betriebssystem nicht im 64/32-Bit- Modus ist
quelle
foo86
64-Bit: p). Wenn dies jedoch akzeptabel ist, können Sie 9 speichern (bearbeiten). .13!) Bytes mitprint((a==64)*a+32*(a==86))
.from platform import*;print({'4':64,'6':32}[machine()[-1]])
würde auch funktionieren.from platform import*;print(architecture()[0][:2])
-> 50 Bytes