Apakah OS saya 32-bit atau 64-bit?


53

Ini tidak terlalu penting lagi, tetapi sesekali seseorang perlu tahu.

Ini golf sederhana: Tanpa input pengguna, beri tahu saya jika komputer tempat kode dijalankan pada sistem operasi 64-bit, atau sistem operasi 32-bit!

Jika kode dijalankan pada sistem operasi 32-bit, cetak "32", jika kode dijalankan pada sistem operasi 64 bit, hasilkan "64". Penting: Cetak string alfanumerik non-kosong lainnya jika tidak 32 atau 64 bit.

Harap dicatat bahwa program 32 bit yang berjalan pada komputer dengan sistem operasi 64 bit akan menampilkan "64". Anda dapat mengasumsikan bahwa pengguna akan menggunakan perangkat lunak 64 bit bila memungkinkan.

Agar memenuhi syarat untuk masuk, kode Anda harus dapat dijalankan pada Windows 4.10 atau sistem Windows yang didukung Microsoft yang lebih baru , dan setidaknya satu rasa Linux yang Anda pilih (asalkan rasa itu gratis). Mod kompatibilitas dapat diinstal, selama program masih mengembalikan nilai yang tepat.

Biasa aturan berlaku.

Catatan: Jika jawaban Anda hanya dimaksudkan untuk mencetak 32 atau 64, tetapi bukan huruf besar, saya akan menerimanya, tetapi itu bukan jawaban yang bersaing.

Saya akan mencoba dan memposting beberapa hasil menjalankan kode-kode ini pada OS yang berbeda nanti!


5
Jadi, "Harap dicatat bahwa program 32 bit yang berjalan pada komputer dengan sistem operasi 64 bit akan menghasilkan" 64 ". Anda dapat mengasumsikan bahwa pengguna akan menggunakan perangkat lunak 64 bit jika memungkinkan." berarti bahwa jika interprettor / compiler dll tersedia dalam 32 bit dan 64 bit, maka OS 32 bit, akan selalu menjalankan versi interpreter 32 bit / etc, dan OS 64 bit akan selalu menjalankan interpreter 64 bit / dll. Jadi khawatir tentang perbedaan antara program menjadi 32 atau 64, dan OS menjadi 32 atau 64, pada dasarnya hanya masalah untuk bahasa dengan implementasi hanya 32 bit. Baik?
Lyndon White

2
Banyak solusi di sini akan mencetak "32" pada OS 64-bit jika kompiler 32-bit digunakan untuk mengkompilasi program. Apakah ini ok?
Martin Rosenau

15
Apa yang ada di dunia "Windows 4.10"? Apakah itu berarti Windows 98? Atau apakah itu berarti Windows NT 4? Apa yang Anda anggap "lebih baru" dari itu? Ini tampaknya tantangan yang dipikirkan dengan sangat buruk.
Cody Grey

13
Tidak ada "spesifikasi windows resmi", dan tidak ada yang menyebut Windows 98 sebagai "Windows 4.10". Anda benar-benar yang pertama. Jadi, alih-alih mencoba terdengar keren atau resmi dengan menggunakan nomor versi, Anda sebaiknya menggunakan nama produk yang sebenarnya . Omong-omong, Windows 9x tidak pernah tersedia dalam versi 64-bit, jadi apakah benar-benar sah bagi saya untuk mengirimkan entri yang hanya berjalan di Windows 98 dan hanya mengembalikan "32"? Tampaknya sangat tidak adil / tidak sportif / tidak menarik, tetapi secara teknis akan diizinkan oleh aturan Anda.
Cody Grey

3
Anda masih belum menjawab pertanyaan tentang versi Windows. Apakah harus dapat berjalan pada Windows 4.10 atau lebih baru berarti pada Windows 4.10 dan semua versi yang lebih baru atau pada versi Windows tunggal, 4.10 atau lebih baru ?
Dennis

Jawaban:


44

x86 Assembly (polyglot), 13 byte

Bytecode:

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

Menentukan fungsi yang mengembalikan 32 jika ditafsirkan sebagai 32-bit, 64 jika 64-bit, dan 32767 jika 16-bit.

Saya ingin membuat polyglot yang berjalan pada Windows dan Linux, tetapi ini jauh lebih sulit daripada yang saya kira. Karena saya tidak yakin bahkan ada cara untuk mencetak nilai pada Windows non-16-bit tanpa menghubungkan.

Penjelasan

Kode ini menggunakan dua memberitahu untuk menentukan arsitektur yang sedang berjalan. Yang pertama adalah instruksi 0x48 — pada 16 dan 32 bit, ini dec %eax, tetapi pada 64 bit, ini adalah awalan ukuran instruksi. Tell kedua adalah instruksi yang sama, namun ketika kita mengeksekusinya pada nilai 0x8000, bit yang paling signifikan dibalik hanya jika ukuran register adalah 16 bit, mengatur flag overflow dan membiarkan kita menggunakan jo.

Dalam 16 bit, kode ini ditafsirkan sebagai berikut:

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

Dalam 32 bit, kode ini ditafsirkan sebagai berikut:

   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

Dalam 64 bit, kode ini ditafsirkan sebagai berikut:

   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

Ini sebenarnya mungkin dalam memimpin, sangat bagus
tuskiomi

1
Ide yang sangat rapi, tetapi seperti yang diterapkan, ini akan mengembalikan nilai yang salah jika dirakit sebagai biner 32-bit dan dijalankan pada sistem operasi 64-bit.
Cody Gray

@CodyGray dari aturan: Anda dapat berasumsi bahwa pengguna akan menggunakan perangkat lunak 64 bit jika memungkinkan. Saya kira ini juga berarti bahwa untuk fungsi kita dapat mengasumsikan bahwa kode penelepon 64 bit bila memungkinkan.
Ruslan

Ah, saya kira itu interpretasi yang adil, @Ruslan. Dan saya melihat Anda sudah memposting jawaban yang ada dalam pikiran saya, seandainya bukan karena masalah ini. :-) Anda mendapat upvote saya.
Cody Grey

apakah byte 48mewakili dec %eaxdalam mode 16-bit?
phuclv

48

kode mesin x86, 12 byte

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

Tidak Disatukan:

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

Fungsi ini berfungsi di Linux ketika digunakan dalam ELF32, mengikuti i386 SysV ABI, serta di Windows / Wine saat digunakan dalam PE32, mengikuti stdcallkonvensi pemanggilan.


Sebenarnya seseorang dapat mengurangi jumlah byte lebih banyak jika mengikuti pendekatan lain .
Ruslan

apa yang akan dilakukan secara teoritis ini dalam lingkungan non 32/64 bit?
tuskiomi

1
@tuskiomi Bagaimanapun, kode ini masih akan mengembalikan 32 atau 64. Satu-satunya perbedaan menafsirkan urutan byte ini dalam mode 16-bit adalah perubahan mnemonik dari eaxke ax. Jadi, jika pemilih di cskebetulan 0x23, hasilnya akan menjadi 64, jika tidak 32.
Ruslan

ini terlihat khusus untuk dua sistem operasi tertentu. Anda dapat dengan mudah memiliki sistem 32-bit dengan cs = 0x23. Lihat bukan jawaban 8-byte saya yang menargetkan CPU sebagai gantinya.
peter ferrie

@ Peterferrie ya, itu sebabnya saya punya jawaban lain . Tapi milikmu mengalahkannya dengan 2 byte.
Ruslan

32

Mathematica, 17 byte

$SystemWordLength

13
Tentu saja ada builtin! (+1)
tuskiomi

Bukankah sebaiknya Anda menambahkan &atau menentukan bahwa ini ada dalam REPL?
LegionMammal978

5
@ LegionMammal978 "Jika kode dijalankan pada sistem operasi 32-bit, cetak" 32 ", jika kode dijalankan pada sistem operasi 64 bit, hasilkan" 64 ". Cetak semua string karakter alfanumerik (kosong) non-kosong apa pun jika tidak keduanya. " Bukan "menyediakan fungsi yang, saat dijalankan, melakukan ini"; "lakukan ini".
Patrick Stevens

17
@ PatrickStevens: Jika pertanyaan tidak menentukan bentuk pengajuan apa yang harus diambil, itu adalah program atau fungsi, tetapi bukan cuplikan, secara default .

3
@ ais523 Saya berpendapat tidak ada perbedaan dalam Mathematica antara program, fungsi, dan cuplikan. Semuanya hanya ekspresi.
ngenisis

21

Boot Loader

Tahukah Anda bahwa GRUB dan IPXE keduanya memiliki bahasa pemrograman lengkap Turing yang dapat diakses saat run-time? Keluarga Syslinux dari boot loader tidak tetapi mereka dapat melakukan ini.

IPXE, 36 byte

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

baris pertama diperlukan jika skrip dijalankan dari jarak jauh, tetapi tidak jika diketik langsung pada baris perintah.

GRUB, 42 byte

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

Syslinux, 186 byte

Ini mengambil tiga file yang pertama adalah syslinux.cfg (atau isolinux.cfg, dll.).

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

dan t.cfg

menu title 32

ans s.cfg

menu title 64

Untuk yang satu ini bagian yang sulit adalah syslinux tidak memiliki kemampuan tampilan teks sederhana, sehingga menu disalahgunakan.


Saya tidak yakin apakah Anda dapat mengetahui resolusi os dengan boot loader, tetapi saya suka idenya
tuskiomi

Ia memeriksa cpu dan digunakan untuk memilih sistem operasi yang tepat. Ini pada dasarnya kode golf dari proyek unboot saya.
Hildred

2
Jadi itu mengubah os berdasarkan arsitektur. Berpikir di luar kotak. Saya suka.
tuskiomi

Apa bytecount?
Restioson

1
@hildred Saya percaya ini akan lebih mudah dibaca jika Anda menggunakan ## iPXE, 36 bytesbukan### ipxe 36
NieDzejkob

21

Julia 14 13 byte

n->8sizeof(1)

Menjelaskan:

  • Fungsi anon, mengambil apa pun (termasuk nothing) mengembalikan integer 32, atau 64
  • Literal integer adalah tipe Intyang tergantung apakah 32 bit atau 64 bit, dapat berupa Int32atauInt64 ( 1bisa berupa angka apa saja)
  • menempatkan nomor sebelum pemanggilan fungsi melakukan penggandaan juxtaposition
  • Ini pada dasarnya adalah versi yang diperkecil dari kode untukSys.WORD_SIZE , digunakan dalam jawaban rahnema1

Jawaban lain yang menyenangkan adalah ()->"$(Int)"[4:5], tapi saya tidak bisa menghitungnya.


-1 terima kasih kepada @Roman Gräf


Anda bisa menggunakan argumen dummy: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

julia, 20 17 16 byte

n->Sys.WORD_SIZE

* Terima kasih kepada @LyndonWhite menghemat 3 byte * Terima kasih kepada @ RomanGräf menyimpan satu byte

Jawaban sebelumnya:

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

Cobalah online!


1
Saya, secara pribadi, seperti ini!
tuskiomi

2
Dengan mengikuti konvensi: codegolf.meta.stackexchange.com/q/2419/62131 Anda dapat mengurangi 3 byte dengan melakukan()->Sys.WORD_SIZE
Lyndon White

1
Anda juga bisa menggunakan argumen dummy: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js), 24 byte

_=>process.arch.slice(1)

Ini adalah fungsi dan kembali '32', '64'atau jika tidak 'rm'.


+1, tapi saya kira lengkungan 64bit bisa menjalankan OS 32bit
Octopus

1
Memberi saya '32' pada Windows 32-bit, jadi sepertinya berfungsi.
Ken YN

5
Anda dapat mengurangi 7 byte jika Anda menggunakan REPL dan osalih-alih process:os.arch().slice(1)
GilZ

Ini mengembalikan arsitektur OS yang dilaporkan ke proses, bukan arsitektur OS yang sebenarnya. Jadi ini tidak berfungsi di Linux. (Punch "setarch" ke mesin pencari favorit Anda.)
David Schwartz

@DavidSchwartz berfungsi dengan baik di kotak linux saya kecuali saya salah paham, tetapi pada PPCG kita dapat mengasumsikan lingkungan yang tidak dimodifikasi dalam hal pengguna mengubah lengkungan
Downgoat

13

C, 33 31 29 23 byte

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

Terima kasih kepada komentator @ceilingcat dan @Dennis untuk kiat bermain golf!


13
Ia juga mengatakan bahwa aturan golf yang biasa berlaku, dan kembali dari suatu fungsi adalah bagian dari standar kami untuk I / O.
Dennis

11
Bukankah itu tergantung pada apakah Anda mengkompilasi sebagai program 32 atau 64 bit?
Ken YN

4
Ini tidak memenuhi persyaratan. " Harap dicatat bahwa program 32 bit yang berjalan di komputer dengan sistem operasi 64 bit harus menampilkan" 64 ". " Ini memberitahu Anda bagaimana program dikompilasi, bukan OS.
David Schwartz

2
@ DavidvidSchwartz "Anda dapat mengasumsikan bahwa pengguna akan menggunakan perangkat lunak 64 bit bila memungkinkan."
Klas Lindbäck

2
Maaf untuk mengatakan itu tetapi sizeof dievaluasi pada waktu kompilasi. Jadi, jika Anda mengkompilasi exe 32 bit dan menjalankannya pada mesin 64 bit, ia akan mengeluarkan 32 sementara itu akan menghasilkan 64 ( stackoverflow.com/questions/2615203/… ). Ide bagus!
Dinaiz

11

PowerShell, 16 byte

8*[IntPtr]::Size

Mendapat ukuran pointer dalam byte, dikalikan dengan 8 untuk mendapatkan bit.


-1 karenayour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r atau lebih baru, bukan dan lebih baru. Saya berani bertaruh sebagian besar jawaban ini sulit, paling-paling, untuk dijalankan pada versi Windows yang lama tidak didukung. Tidak masuk akal untuk mengharapkan orang untuk menguji pada 98 dari semua OS - bahkan tidak mudah untuk menginstal di VM hari ini (percayalah, saya sudah mencoba. Tidak akan berjalan pada KVM, dan memiliki interaksi yang menarik dengan adaptor layar VBox) . (Bahkan tidak memiliki konsep 64-bit ... itu persyaratan yang benar-benar konyol.)
Bob

1
@ ub3rst4r Saya ragu bahwa semua bahasa pemrograman yang ditafsirkan di sini memiliki implementasi yang bekerja pada Windows 4.10!
Martin Rosenau

1
Ini sepertinya gagal jika powerhell 32-bit pada OS 64-bit.
Chris J

@ ChrisJ Setidaknya pada Win10 dan Win2012 R2 mengembalikan hasil yang tepat dari x86 PowerShell. Belum diuji di Linux.
Booga Roo

10

Python 2, 52, 48, 42 41 byte

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

Terima kasih untuk benar-benar manusia!


Perbesar! melintasi garis di bawah satu menit.
tuskiomi

Saya akan menunda pengujian ini sampai saya di rumah, tapi saya tidak yakin ini mencetak "32" dan "64", tetapi kasus lain saya yakin.
tuskiomi

@ Tomkiomi, ini mencetak "32bit" atau "64bit"
Daniel

1
from struct import*;print calcsize("P")*8lebih pendek.
totallyhuman

12
Jika Anda menjalankan ini pada Python 32-bit dalam OS 64-bit, saya pikir ini akan berbohong kepada Anda. Sebagian besar jawaban lain juga tampaknya sensitif terhadap hal itu ...
Nick T

10

Java 8, 45 byte

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

@Dopapp Apa maksudnya ini adalah cuplikan, bukan program atau fungsi. Di Jawa 8, ini seharusnya berfungsi:n=>System.getProperty("os.arch")
NoOneIsHere

@NoOneIsHere, oh, terima kasih sudah melebihi kepalaku
Daniel

2
"Jika kode dijalankan pada sistem operasi 32-bit, cetak" 32 ", jika kode tersebut dijalankan pada sistem operasi 64 bit, hasilkan" 64 ". Cetak sembarang (tanpa) string karakter alfanumerik kosong (jika ada) tidak juga. " Ini tidak melakukan itu sama sekali ...
Olivier Grégoire

4
Bisakah Anda mendapatkan Java 8 untuk Windows 98 (v4.10)?
TessellatingHeckler

4
@TessellatingHeckler Java 8 membutuhkan "i586" (apa pun artinya). Entri mengatakan: "kode Anda harus dapat dijalankan pada Windows 4.10 atau lebih baru", bukan "kode Anda harus dapat dijalankan pada Windows 4.10 dan yang lebih baru". Ini berjalan pada Windows yang lebih baru .
Olivier Grégoire


8

Windows CMD, 56 52 byte (terima kasih Bob!)

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

Masih mengejutkan panjang - terpanjang sejauh ini!


1
Sebenarnya, %windir%\SysWOW64bahkan lebih pendek, kurasa ...
Bob

7
" harus dapat berjalan di Windows 4.10 atau lebih baru, dan setidaknya satu rasa Linux yang Anda pilih " - rasa Linux untuk ini?
TessellatingHeckler

1
@TessellatingHeckler jika Anda menginstal Wine ...?
Ken YN

1
Bagaimana dengan menggunakan steno? if EXIST "c:\Progra~3" (echo 64)else echo 32Secara default Anda memiliki ProgramDatadan Program Filesjadi jika yang ketiga ada, kita harus 64
Marie

3
Apa yang akan dicetak untuk OS 8-bit ini?
tuskiomi

7

C, Win32 API, 103 183 byte

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

Sebenarnya ada lebih dari 2 kasus di sini. Mari kita periksa

  • Yang termudah: IsWow64Processtidak ada: Kami menggunakan OS 32 bit

Untuk dua kasus selanjutnya kita perlu memiliki pengetahuan bahwa biner kita akan dapat dieksekusi 32 bit. Dan uraian tentang apa yang akan keluar ke dalam parameter keluarIsWow64Process

Pointer ke nilai yang diatur ke TRUE jika proses berjalan di bawah WOW64. Jika proses ini berjalan di bawah Windows 32-bit, nilainya diatur ke FALSE. Jika prosesnya adalah aplikasi 64-bit yang berjalan di bawah Windows 64-bit, nilainya juga disetel ke FALSE.

Itu membuat kita dengan dua kasus tambahan:

  • IsWow64Process ada, dan menghasilkan BENAR -> Kami berada di mesin 64 bit
  • IsWow64Process ada, dan menghasilkan SALAH -> Kami berada di mesin 32 bit

Kami tidak khawatir tentang bagian di mana aplikasi 64-bit pada Windows 64-bit menghasilkan FALSE. Seperti yang kita ketahui bahwa aplikasi kita adalah 32-bit

Oh dan ada satu kasus tambahan yang tidak dicakup oleh tantangan ini dan harus jarang terjadi:

  • IsWow64Process ada, tetapi gagal: Kami default ke mesin 32-bit.

Ini harus mencakup sebagian besar Sistem Operasi Windows NT. Hanya diuji pada Win10 64-Bit, Win 7 64-Bit, Win 8.1 32-Bit dan WinXP SP1 32-Bit


Jawaban asli:

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

Yang pasti kita perlu membedakan hanya 2 kasus

  • IsWow64Process tidak ada di kernel32.dll => Kami menggunakan mesin 32 bit.

  • IsWow64Process tidak ada => Kami berada di mesin 64 bit.

Nilai aktual yang diberikan oleh IsWow64Processtidak relevan untuk tantangan ini, karena kami ingin biner 32bit dalam hal apa pun.

Tidak seperti kebanyakan jawaban, ini tidak bergantung pada biner itu sendiri yang dikompilasi pada mesin yang dieksekusi.

Jika saya tahu fungsi yang lebih pendek yang hanya ada pada mesin 64bit dan bukan 32bit, saya bisa mempersingkat jawabannya.


2
Lepaskan .dlldari string nama modul. Ini tidak hanya bagus untuk bermain golf, tetapi sebenarnya ini juga merupakan praktik yang lebih baik dalam penggunaan normal. Juga, untuk tujuan bermain golf, Anda dapat menjatuhkan ruang setelah #include.
Cody Grey

Terima kasih, saya sebenarnya ingin mengurangi semuanya dengan hanya mencari modul yang dapat ditemukan pada 64bit tetapi tidak pada 32bit. Aku masih mencari. Sayangnya (untuk tujuan ini) tidak ada modul yang disebut WoW64.
MrPaulch

Sebenarnya ada a wow64.dlldan Wow64Win.dll, tapi saya belum pernah mencoba menelepon GetModuleHandledengan itu. Masalahnya, bagaimanapun, adalah bahwa mereka hanya akan dimuat untuk proses 32-bit yang berjalan pada mesin 64-bit, bukan untuk proses 64-bit yang berjalan pada mesin 64-bit.
Cody Grey

Saya sudah. Mereka mengembalikan 0 bahkan pada mesin 64bit. Masuk akal sebenarnya. Mereka tidak ada untuk dihubungkan secara langsung. Sistem menangani pengalihan selama runtime.
MrPaulch

Ooh, masalahnya. Dari dokumentasi SDK: "Perhatikan bahwa teknik ini bukan cara yang dapat diandalkan untuk mendeteksi apakah sistem operasi adalah versi 64-bit Windows karena Kernel32.dll dalam versi terbaru dari Windows 32-bit juga mengandung fungsi ini."
Cody Grey

7

C #, 60 50 byte

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

Terima kasih @TheLethalCoder


1
Selamat datang di situs ini! :)
DJMcMayhem

4
Simpan 4 byte jika Anda menghapus 'Line'
John

1
juga dapat menghapus 'Lingkungan.' dan 'menghibur.' dengan asumsi penggunaan using static System.Environment;danusing static System.Console;
John

1
juga, ganti WriteLinekeWrite
Thomas Ayoub

7
@ John Terakhir kali saya memeriksa, impor harus disertakan dan akan menambah jumlah byte
Ceshion

6

Ruby, 22 byte

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

["any string"].pack("p")mengembalikan string yang byte-nya sesuai dengan pointer yang menunjuk ke arah "any string", dan 8 karakter jika OS 64-bit, atau 4 karakter jika OS 32-bit.


Karena ini menggunakan ukuran pointer, ini akan mencetak 32-bit ketika interpreter Ruby adalah biner 32-bit pada OS 64-bit. Jadi merindukan aturan.
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.Jadi pengguna 64-bit akan dianggap menjalankan Ruby 64-bit.
Nilai Tinta

6

R, 16 byte

.Machine[[18]]*8

Mengembalikan ukuran pointer.


1
Seperti semua solusi ukuran pointer, ini akan mencetak hasil yang salah ketika program ini adalah biner 32-bit yang berjalan pada OS 64-bit.
DarkDust

1
@DarkDust R ditafsirkan, dan kita dapat mengasumsikan pengguna menggunakan perangkat lunak 64-bit jika memungkinkan, demikian juga juru bahasa 64-bit. IMHO, aturan hanya berlaku untuk bahasa yang dikompilasi
NieDzejkob

@NieDzejkob Itulah logika yang sama persis yang saya gunakan untuk jawaban saya di PHP ketika orang lain memberikan jenis komentar yang sama sebagai jawaban atas jawaban saya, saya berharap orang lain membaca yang sama dari pertanyaan seperti yang kita miliki dengan asumsi pengguna akan menggunakan 64- perangkat lunak bit jika memungkinkan dengan bahasa yang ditafsirkan.
Bja

6

Perl, 18 15 18 byte

say length pack p8

Saya mendapatkan 64␤komputer 32 bit saya, karena perldibangun dengan 64bit IV. Anda akan menemukan ini biasanya terjadi ketika berjalan pada Windows versi 32bit.
Brad Gilbert b2gills

@ BradGilbertb2gills Saya mengembalikan kode ke versi sebelumnya; ini harus bekerja bahkan dalam kasus ini. Beri tahu saya jika masih tidak berfungsi, saya akan menghapus jawaban saya.
Grimmy

1
Itu bekerja dengan benar.
Brad Gilbert b2gills

Tampaknya salah pada HP 9000/785. Memberikan 32. Tapi saya tidak berpikir ada 32-bit HP / PA-RISC CPU.
Ole Tange

6

kode mesin x86, 8 byte

31 C0 B0 40 48 24 60 C3

Tidak Disatukan:

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

Jika dikompilasi sebagai 64-bit yang dapat dieksekusi, ia mengembalikan 64 in eax , dan jika dikompilasi sebagai 32-bit, kemudian mengembalikan 32 - terlepas dari OS.

Jawaban ini bergantung pada aturan yang mengatakan:

Anda dapat mengasumsikan bahwa pengguna akan menggunakan perangkat lunak 64 bit bila memungkinkan.


Meskipun ini merupakan pendekatan yang menarik, bagaimana ia dapat ditulis ke dalam suatu program sedemikian rupa sehingga dapat benar-benar dieksekusi? Setiap metode yang dapat saya pikirkan untuk mengeksekusi kode biner selain menulis fungsi loader Anda sendiri menggunakan file yang spesifik untuk kode 64-bit atau 32-bit. Oleh karena itu, Anda memerlukan dua salinan kode ini untuk benar-benar berjalan ...
Jules

@ Jules Anda dapat memasukkannya sebagai inline assembly ke program bahasa tingkat tinggi, seperti di sini . Maka Anda hanya perlu menggunakan kompiler platform-asli Anda dengan opsi default, dan Anda akan mendapatkan bitness.
Ruslan

@ l4m2 kenapa kamu berteriak padaku? Tapi bagaimanapun Anda benar, kedua byte ini tampaknya merupakan sampah yang tersisa dari eksperimen saya. Akan dihapus.
Ruslan

5

PHP, 18 Bytes

<?=PHP_INT_SIZE*8;

Ini dengan benar menangani semua kasing 32, 64 dan CPU bit lainnya asalkan PHP_INT_SIZE benar, ia akan menampilkan ukuran CPU yang tepat, apa pun CPU yang dijalankan oleh PHP!

Jika PHP sedang berjalan

OS 32-bit PHP_INT_SIZE == 4,

OS 64-bit PHP_INT_SIZE == 8,

OS 16-bit PHP_INT_SIZE == 2 (secara teoritis)

OS 8-bit PHP_INT_SIZE == 1 (lagi secara teoritis)

128-bit OS PHP_INT_SIZE == 16 (Belum tercapai tetapi mungkin)


2
konstanta itu memiliki ukuran OS di mana PHP dibangun, tidak dijalankan
Einacio

2
@Einacio Ya, tetapi dalam tantangan awal poster menulis "Anda dapat mengasumsikan bahwa pengguna akan menggunakan perangkat lunak 64 bit bila memungkinkan", Oleh karena itu jika OS 64-bit maka versi PHP yang berjalan pada OS harus diasumsikan menjadi 64-bit! (Catatan: Saya tidak melihat ini sebagai celah hanya logika murni berdasarkan dari tantangan awal.)
Bja

4

C # (29 byte)

Console.Write(IntPtr.Size*8);

10
Seperti semua solusi ukuran pointer, ini akan mencetak hasil yang salah ketika program ini adalah biner 32-bit yang berjalan pada OS 64-bit.
DarkDust

1
Perlu menentukan bahwa ini dikompilasi untuk "AnyCPU" dengan kotak centang "Lebih suka 32-bit" tidak dicentang.
Cody Gray

4

PowerShell, 17 52 byte

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

Mengembalikan 64 jika salah satu dari yang berikut ini benar:

  • Anda memiliki direktori pada drive Anda saat ini dengan nama file yang diakhiri dengan paren dekat, ide untuk dideteksi Program Files (x86).
  • archmengembalikan string yang diakhiri dengan 4(ASCII 52), seperti x86_64, sebagai lawan dari mis i686.

Try -catch dimaksudkan untuk menghindari kesalahan yang Anda dapatkan jika gci tidak mengembalikan apa pun dan Anda tidak memiliki lengkungan . Saya belum menemukan cara yang lebih singkat untuk melakukannya sejauh ini. gci digunakan lebih dari ls karena di Linux, ls akan menghasilkan kesalahan yang terlihat.

Versi ini harus mendeteksi apakah OS 64-bit daripada hanya PowerShell, dan diuji untuk bekerja pada Windows dan Linux. Untuk dukungan Mac, ganti archdengan uname -m.

Versi khusus Windows sebelumnya: -!(ls \*`))*32+64


distro linux apa yang dijalankan ini?
tuskiomi

@tuskiomi Oh, salahku - aku mengerti maksudmu. Tidak membaca tantangan dengan benar. Haruskah saya menghapus jawabannya?
Andy C.

Jika Anda tahu itu akan bekerja dengan WINE, Anda harus menyimpannya.
tuskiomi

@tuskiomi Setidaknya Ubuntu 14.04, 16.04, RHEL7, CentOS7 dan beberapa versi SUSE: github.com/PowerShell/PowerShell/releases
Xudonax

4

Swift 4 REPL / Playground, 12 byte

Int.bitWidth

Intberukuran kata, bertindak seperti Int32atau Int64tergantung pada sistem.


Bukankah ini kode-snip, jadi harus dicetak? Atau apakah mengatakan Anda menggunakan REPL untuk mengatasi batasan itu?
Lyndon White

1
Terserah hakim. Penggunaan REPL tidak terlalu umum, tetapi Swift Playgrounds sangat populer (terutama di iPad). Secara pribadi, saya pikir itu permainan yang adil. Orang-orang merancang bahasa pemrograman khusus untuk bermain golf yang secara implisit mencetak nilai, dan ini tidak berbeda
Alexander

4

Ruby, 10 byte

p 0.size*8

Meskipun Ruby dapat menggunakan bilangan bulat dengan panjang berapa pun, secara internal Ruby menyimpan nilai yang sesuai dengan kata mesin Fixnum. Metode ini Fixnum#sizeselalu mengembalikan panjang dalam byte kata mesin.

The Fixnumkelas telah dihapus pada Ruby 2.4.0, fungsinya termasuk dalam kelas Integer. Kode tersebut berdiri.


4

Shell, 26 byte

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

Anda bisa menggunakan archbukan uname -m.
Dennis

1
@ Dennis Tidak harus. Di makro: uname -m-> x86_64, tapi arch-> i386. Karena macos :( Juga, ini khusus untuk bash - gagal pada zsh.
viraptor

@StevenPenny zshakan mencoba menafsirkan ?sebagai wildcard / karakter tunggal.
Gagang Pintu

Apakah ini berjalan di Windows?
Ajasja

1
@Ajasja dengan Cygwin
Steven Penny

4

Bash, 25 17 byte

getconf LONG_BIT

Terima kasih kepada Dennis untuk bantuan bermain golf.


4

C, 22 byte

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

Ini adalah jawaban berbasis ukuran pointer yang mengasumsikan biner asli. Itu 0dilemparkan ke int**(alamat 0x0). Kemudian kita tambahkan 8 ke 0, yang, dalam C advance, penunjuk dengan sizeof(int*)*8. 4 byte * 8 bit = 32, 8 byte * 8 bit = 64. Jadi kita dapatkan (int**)0x20dan 0x40yang kemudian secara implisit dilemparkan sebagai bilangan bulat dengan mengembalikannya dari intfungsi mengembalikan secara implisit .

C, berdiri sendiri, 34 byte

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

C, bersenang-senang dengan Unicode, 30 poin kode, 34 byte (UTF-8)

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

Saya sudah mencoba memahami bagaimana ini bekerja, tetapi saya tidak mengerti. Bisakah Anda menambahkan penjelasan?
NieDzejkob

@jbcreix pintar ...
NieDzejkob

3

Java, 50 byte

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


Apakah itu perpustakaan? Jika ya, Anda harus menyebutkannya! Saya tidak melihat kelas yang tersedia di JDK 8 Oracle (saya tidak punya JDK 6 dan 7 yang biasa saya miliki, atm).
Olivier Grégoire

2
Jawaban ini tidak valid. Itu tidak mencetak.
Philipp

6
Mengutip Dennis:> Ia juga mengatakan bahwa aturan golf yang biasa berlaku, dan kembali dari suatu fungsi adalah bagian dari standar kami untuk I / O.
Asu

Ubah fungsi lamba menjadi lebih sedikit byte:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig

3

PHP, 29 byte

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

https://3v4l.org/Y6JXv


Ooh. Saya suka yang ini. Bagaimana cara kerjanya?
tuskiomi

4
php_uname('m')kembali x86_64pada OS 64 bit, kalau tidak sesuatu seperti i386. 4menjadi karakter ke 6 (5th 0 diindeks) dari string '4' - 4 == 0 == false,. Dan @hanya menekan peringatan untuk string yang tidak dikutip, dan offset yang tidak diinisialisasi.
Petah

2
Ini mendeteksi arsitektur PHP, bukan OS. Saya menjalankan PHP 32-bit pada Windows 64-bit, php_uname('m')kembali 'i586'.
Gras Double

@GrasDouble baik saya kira ymmv, saya bekerja untuk saya Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah

1
@tuskiomi ini akan mencetak 64 jika ada sistem operasi 8-bit
Bja

3

Python 3 , 77 84 71 59 59 byte

-13 byte, terima kasih kepada @JonathanAllan!
Turun ke 59 oleh @Clearer

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

Cobalah online!

Tinju golf waktu saya :)
Harus menampilkan versi yang benar bahkan ketika menjalankan 32bit-Python pada 64bit-OS.
Dengan asumsi platform.machine()memberi i*86atau x86untuk 32Bit-OS. Saya tidak punya satu tersedia untuk memeriksa ini. Output adalah 0ketika OS tidak dalam
Edit 64 / 32Bit : Pernyataan cetak ditambahkan, sehingga mendapat 7 byte lebih lama


Tidak yakin apakah itu dapat diterima karena dimungkinkan untuk menjalankan OS 32 bit pada mesin 64 bit (atau memiliki beberapa mesin yang disebut foo8664 bit: p), tetapi jika itu dapat diterima maka Anda dapat menyimpan 9 (edit .. .13!) Byte dengan print((a==64)*a+32*(a==86)).
Jonathan Allan

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

@Clearer Ini akan melewatkan batasan berikut: Penting: Cetak string karakter alfanumerik tidak kosong lainnya jika tidak 32 atau 64 bit. .
tOmAtE

@tOmAtE jika bukan 32 atau 64 bit, ia akan melempar pengecualian, yang mencetak string yang tidak kosong.
jelas

2
Coba arsitektur (), simpan dict: from platform import*;print(architecture()[0][:2])-> 50 byte
bugmenot123
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.