Hệ điều hành của tôi là 32 bit hay 64 bit?


53

Nó không còn quá quan trọng nữa, nhưng đôi khi ai đó cần biết.

Đây là một môn đánh gôn đơn giản: Không có đầu vào của người dùng, hãy cho tôi biết máy tính chạy mã trên hệ điều hành 64 bit hay hệ điều hành 32 bit!

Nếu mã được chạy trên hệ điều hành 32 bit, hãy in "32", nếu mã được chạy trên hệ điều hành 64 bit, hãy xuất "64". Quan trọng: In bất kỳ chuỗi ký tự chữ và số không trống nào khác nếu đó không phải là 32 hoặc 64 bit.

Xin lưu ý rằng chương trình 32 bit chạy trên máy tính có hệ điều hành 64 bit sẽ xuất ra "64". Bạn có thể cho rằng người dùng sẽ sử dụng phần mềm 64 bit bất cứ khi nào có thể.

Để đủ điều kiện tham gia, mã của bạn phải có khả năng chạy trên Windows 4.10 hoặc các hệ thống Windows mới hơn do Microsoft hỗ trợ và ít nhất một hương vị Linux mà bạn chọn (miễn là hương vị đó là miễn phí). Các mod tương thích có thể được cài đặt, miễn là chương trình vẫn trả về đúng giá trị.

Các quy tắc thông thường được áp dụng.

Lưu ý: Nếu câu trả lời của bạn chỉ có nghĩa là in ra 32 hoặc 64, nhưng không phải là trường hợp thay thế, tôi sẽ chấp nhận, nhưng đó không phải là câu trả lời cạnh tranh.

Tôi sẽ thử và đăng một số kết quả chạy các mã này trên các HĐH khác nhau sau!


5
Vì vậy, "Xin lưu ý rằng chương trình 32 bit chạy trên máy tính có hệ điều hành 64 bit sẽ xuất ra" 64 ". Bạn có thể giả sử rằng người dùng sẽ sử dụng phần mềm 64 bit bất cứ khi nào có thể." có nghĩa là nếu trình thông dịch / trình biên dịch, v.v. có sẵn ở cả 32 bit và 64 bit, thì HĐH 32 bit, sẽ luôn chạy phiên bản 32 bit của trình thông dịch / etc và HĐH 64 bit sẽ luôn chạy trình thông dịch 64 bit /Vân vân. Vì vậy, đáng lo ngại về sự khác biệt giữa chương trình là 32 hoặc 64 và HĐH là 32 hoặc 64, về cơ bản chỉ là vấn đề đối với các ngôn ngữ chỉ có triển khai 32 bit. Đúng?
Lyndon White

2
Nhiều giải pháp ở đây sẽ in "32" trên HĐH 64 bit nếu trình biên dịch 32 bit được sử dụng để biên dịch chương trình. Được không
Martin Rosenau

15
Điều gì trên thế giới là "Windows 4.10"? Điều đó có nghĩa là Windows 98? Hay nó có nghĩa là Windows NT 4? Bạn nghĩ gì về "mới" hơn thế? Đây có vẻ là một thách thức đặc biệt kém suy nghĩ.
Cody Grey

13
Không có "thông số cửa sổ chính thức" và không ai gọi Windows 98 là "Windows 4.10". Bạn đúng nghĩa là người đầu tiên. Vì vậy, có thể thay vì cố gắng tỏ ra lạnh lùng hoặc chính thức bằng cách sử dụng số phiên bản, bạn chỉ nên sử dụng tên sản phẩm thực tế . Nhân tiện, Windows 9x không bao giờ có sẵn trong bản dựng 64 bit, vậy tôi có thực sự hợp pháp khi gửi một mục chỉ chạy trên Windows 98 và chỉ trả về "32" không? Có vẻ rất không công bằng / không quan tâm / không thú vị, nhưng về mặt kỹ thuật sẽ được cho phép theo quy tắc của bạn.
Cody Grey

3
Bạn vẫn chưa trả lời câu hỏi về phiên bản Windows. Liệu phải có khả năng chạy trên Windows 4.10 hoặc mới hơn trung bình trên Windows 4.10 và tất cả các phiên bản mới hơn hoặc trên bất kỳ phiên bản Windows duy nhất, 4.10 hoặc mới hơn ?
Dennis

Câu trả lời:


44

Hội x86 (polyglot), 13 byte

Mã byte:

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

Xác định hàm trả về 32 nếu được hiểu là 32 bit, 64 nếu 64 bit và 32767 nếu 16 bit.

Tôi muốn tạo ra một polyglot chạy trên Windows và Linux, nhưng điều này khó hơn nhiều so với tôi nghĩ. Vì tôi không chắc có cách nào để in một giá trị trên Windows không 16 bit mà không cần liên kết.

Giải trình

Mã này sử dụng hai thông báo để xác định kiến ​​trúc mà nó đang chạy. Đầu tiên là lệnh 0x48, trên 16 và 32 bit, đây là dec %eax, nhưng trên 64 bit, nó là tiền tố kích thước lệnh. Thông báo thứ hai là cùng một hướng dẫn, tuy nhiên, khi chúng tôi thực hiện nó trên giá trị 0x8000, bit quan trọng nhất chỉ được lật nếu kích thước thanh ghi là 16 bit, đặt cờ tràn và cho phép chúng tôi sử dụng jo.

Trong 16 bit, mã này được hiểu như sau:

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

Trong 32 bit, mã này được hiểu như sau:

   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

Trong 64 bit, mã này được hiểu như sau:

   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

Điều này thực sự có thể là trong vai chính, rất hay
tuskiomi

1
Một ý tưởng rất gọn gàng, nhưng khi được thực hiện, điều này sẽ trả về giá trị sai nếu được lắp ráp dưới dạng nhị phân 32 bit và chạy trên hệ điều hành 64 bit.
Cody Grey

@CodyGray từ các quy tắc: Bạn có thể cho rằng người dùng sẽ sử dụng phần mềm 64 bit bất cứ khi nào có thể. Tôi cho rằng điều này cũng có nghĩa là đối với các hàm chúng ta có thể giả sử rằng mã người gọi là 64 bit bất cứ khi nào có thể.
Ruslan

À, tôi cho rằng đó là một cách giải thích công bằng, @Ruslan. Và tôi thấy bạn đã đăng câu trả lời tôi có trong đầu , phải không cho vấn đề này. :-) Bạn đã có upvote của tôi.
Cody Grey

byte 48đại diện dec %eaxtrong chế độ 16 bit?
phuclv

48

mã máy x86, 12 byte

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

Ung dung:

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

Hàm này hoạt động trong Linux khi được sử dụng trong ELF32, theo i386 SysV ABI, cũng như trong Windows / Wine khi được sử dụng trong PE32, theo stdcallquy ước gọi.


Trên thực tế, người ta có thể giảm số byte thậm chí nhiều hơn nếu theo cách tiếp cận khác .
Ruslan

Về mặt lý thuyết, điều này sẽ làm gì trong môi trường không 32/64 bit?
tuskiomi

1
@tuskiomi Trong mọi trường hợp, mã này vẫn sẽ trả về 32 hoặc 64. Sự khác biệt duy nhất của việc diễn giải chuỗi byte này trong chế độ 16 bit sẽ là một sự thay đổi của ghi nhớ từ eaxsang ax. Vì vậy, nếu công cụ chọn csxảy ra 0x23, kết quả sẽ là 64, nếu không là 32.
Ruslan

điều này có vẻ cụ thể cho hai hệ điều hành cụ thể, mặc dù. Bạn có thể dễ dàng có một hệ thống 32 bit với cs = 0x23. Thay vào đó, hãy xem câu trả lời 8 byte của tôi nhắm vào CPU.
perr ferrie

@peterferrie yeah, đó là lý do tại sao tôi có câu trả lời khác . Nhưng bạn không vượt quá 2 byte.
Ruslan

32

Toán học, 17 byte

$SystemWordLength

13
Tất nhiên là có tích hợp! \ s (+1)
tuskiomi

Bạn không nên thêm &hoặc chỉ định rằng đây là trong REPL?
LegionMammal978

5
@ LegionMammal978 "Nếu mã được chạy trên hệ điều hành 32 bit, hãy in" 32 ", nếu mã được chạy trên hệ điều hành 64 bit, hãy xuất" 64 ". In bất kỳ chuỗi ký tự chữ và số không trống nào khác nếu không. " Không "cung cấp một chức năng mà khi chạy, thực hiện điều này"; chỉ "làm điều này".
Patrick Stevens

17
@PatrickStevens: Nếu câu hỏi không chỉ định hình thức gửi, thì đó là một chương trình hoặc chức năng, nhưng không phải là một đoạn mã, theo mặc định .

3
@ ais523 Tôi sẽ tranh luận rằng không có sự phân biệt trong Mathicala giữa các chương trình, chức năng và đoạn trích. Tất cả mọi thứ chỉ là một biểu hiện.
ngenisis

21

Bộ tải khởi động

Bạn có biết rằng cả GRUB và IPXE đều có ngôn ngữ lập trình hoàn chỉnh Turing có thể truy cập vào thời gian chạy không? Họ bộ tải khởi động Syslinux không nhưng họ có thể làm điều này.

IPXE, 36 byte

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

dòng đầu tiên là cần thiết nếu tập lệnh được chạy từ xa, nhưng không được gõ trực tiếp vào dòng lệnh.

GRUB, 42 byte

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

Syslinux, 186 byte

Điều này có ba tệp đầu tiên là syslinux.cfg (hoặc isolinux.cfg, v.v.).

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

và t.cfg

menu title 32

ans s.cfg

menu title 64

Đối với điều này, điều khó khăn là syslinux không có bất kỳ khả năng hiển thị văn bản đơn giản nào, vì vậy menu bị lạm dụng.


Tôi không chắc liệu bạn có thể cho biết độ phân giải os bằng bộ tải khởi động hay không, nhưng tôi thích ý tưởng này
tuskiomi

Nó kiểm tra cpu và được sử dụng để chọn đúng hệ điều hành. Đây về cơ bản là mã golf từ dự án unboot của tôi.
hildred

2
Vì vậy, nó thay đổi hệ điều hành dựa trên kiến ​​trúc. Suy nghĩ bên ngoài hộp. Tôi thích.
tuskiomi

Bytecount là gì?
Restioson

1
@hildred Tôi tin rằng nó sẽ dễ đọc hơn nếu bạn sử dụng ## iPXE, 36 bytesthay vì### ipxe 36
NieDzejkob

21

Julia 14 13 byte

n->8sizeof(1)

Giải thích:

  • Hàm Anon, lấy bất cứ thứ gì (bao gồm nothing) trả về số nguyên 32 hoặc 64
  • Chữ nguyên là loại Inttùy thuộc vào 32 bit hoặc 64 bit, là một Int32hoặc một Int64( 1có thể là bất kỳ chữ số nào)
  • đặt một số trước khi gọi hàm thực hiện phép nhân juxtap vị trí
  • Về cơ bản, đây là phiên bản rút gọn của mã choSys.WORD_SIZE , được sử dụng trong câu trả lời của rahnema1

Câu trả lời thú vị khác là ()->"$(Int)"[4:5], nhưng tôi không thể đếm ngược được câu hỏi đó.


-1 cảm ơn @Roman Gräf


Bạn có thể sử dụng một đối số giả: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

julia, 20 17 16 byte

n->Sys.WORD_SIZE

* Cảm ơn @LyndonWhite đã lưu 3 byte * Cảm ơn @ RomanGräf đã lưu một byte

Câu trả lời trước:

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

Hãy thử trực tuyến!


1
Tôi, cá nhân, như thế này!
tuskiomi

2
Theo quy ước sau: codegolf.meta.stackexchange.com/q/2419/62131 bạn có thể tắt 3 byte bằng cách thực hiện()->Sys.WORD_SIZE
Lyndon White

1
Bạn cũng có thể sử dụng một đối số giả: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js), 24 byte

_=>process.arch.slice(1)

Đây là một chức năng và lợi nhuận '32', '64'hoặc nếu không phải 'rm'.


+1, nhưng tôi cho rằng một vòm 64 bit có thể đang chạy HĐH 32 bit
Octopus

1
Cung cấp cho tôi '32' trên Windows 32 bit, do đó, nó dường như hoạt động.
Ken YN

5
Bạn có thể tắt 7 byte nếu bạn đang sử dụng REPL và osthay vì process:os.arch().slice(1)
GilZ

Điều này trả về kiến ​​trúc hệ điều hành được báo cáo cho quá trình, không phải kiến ​​trúc hệ điều hành thực tế. Vì vậy, điều này không hoạt động trên Linux. (Đấm "setarch" vào công cụ tìm kiếm yêu thích của bạn.)
David Schwartz

@DavidSchwartz nó hoạt động tốt trên hộp linux của tôi trừ khi tôi hiểu nhầm, nhưng trên PPCG, chúng tôi có thể giả sử một môi trường không thay đổi về mặt người dùng thay đổi vòm
Downgoat

13

C, 33 31 29 23 byte

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

Cảm ơn các bình luận viên @ceilingcat và @Dennis cho các mẹo chơi gôn!


13
Nó cũng nói rằng các quy tắc golf mã thông thường được áp dụng và trả về từ một chức năng là một phần của mặc định của chúng tôi đối với I / O.
Dennis

11
Điều đó có phụ thuộc vào việc bạn biên dịch thành chương trình 32 hay 64 bit không?
Ken YN

4
Điều này không tuân thủ các yêu cầu. " Xin lưu ý rằng chương trình 32 bit chạy trên máy tính có hệ điều hành 64 bit sẽ xuất ra" 64 ". " Điều này cho bạn biết cách chương trình được biên dịch, không phải hệ điều hành là gì.
David Schwartz

2
@DavidSchwartz "Bạn có thể cho rằng người dùng sẽ sử dụng phần mềm 64 bit bất cứ khi nào có thể."
Klas Lindbäck

2
Rất tiếc phải nói điều đó nhưng sizeof được đánh giá tại thời điểm biên dịch. Vì vậy, nếu bạn biên dịch exe 32 bit và chạy nó trên máy 64 bit, nó sẽ xuất ra 32 trong khi nó sẽ xuất ra 64 ( stackoverflow.com/questions/2615203/ Lỗi ). Ý tưởng tốt đẹp mặc dù!
Dinaiz

11

PowerShell, 16 byte

8*[IntPtr]::Size

Lấy kích thước con trỏ tính bằng byte, nhân với 8 để nhận bit.


-1 vìyour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r hoặc mới hơn, không phải mới hơn. Tôi sẵn sàng đặt cược rất nhiều câu trả lời trong số những câu trả lời này, rất khó, để chạy trên phiên bản Windows không được hỗ trợ lâu. Thật không hợp lý khi hy vọng mọi người sẽ thử nghiệm trên 98 hệ điều hành - thậm chí không dễ cài đặt máy ảo trong những ngày này (tin tôi đi, tôi đã thử. Không chạy trên KVM và nó có các tương tác thú vị với bộ điều hợp hiển thị VBox) . (Nó thậm chí không có khái niệm 64-bit ... đó là một yêu cầu thực sự vô lý.)
Bob

1
@ ub3rst4r Tôi nghi ngờ rằng tất cả các ngôn ngữ lập trình được giải thích ở đây đều có triển khai trên Windows 4.10!
Martin Rosenau

1
Điều này có vẻ như thất bại nếu đó là quyền hạn 32 bit trên hệ điều hành 64 bit.
Chris J

@ChrisJ Ít nhất là trên Win10 và Win2012 R2, nó trả về kết quả phù hợp từ x86 PowerShell. Chưa được thử nghiệm trên Linux.
Booga Roo

10

Python 2, 52, 48, 42 41 byte

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

Cảm ơn hoàn toàn!


thu phóng! trên dòng dưới một phút.
tuskiomi

Tôi sẽ ngừng thử nghiệm điều này cho đến khi tôi về nhà, nhưng tôi không chắc điều này sẽ in ra "32" và "64", nhưng những trường hợp khác tôi tự tin.
tuskiomi

@tuskiomi, bản này in "32 bit" hoặc "64 bit"
Daniel

1
from struct import*;print calcsize("P")*8ngắn hơn
hoàn toàn là

12
Nếu bạn chạy nó trên Python 32 bit trong HĐH 64 bit, tôi nghĩ điều này sẽ nói dối bạn. Hầu hết các câu trả lời khác cũng có vẻ nhạy cảm với dù sao đi nữa ...
Nick T

10

Java 8, 45 byte

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

@Dopapp Điều anh ấy muốn nói là đây là một đoạn trích, không phải là một chương trình hay chức năng. Trong Java 8, điều này sẽ hoạt động:n=>System.getProperty("os.arch")
NoOneIsHere

@NoOneIsHere, oh cảm ơn bạn đã đi qua đầu tôi
Daniel

2
"Nếu mã được chạy trên hệ điều hành 32 bit, hãy in" 32 ", nếu mã được chạy trên hệ điều hành 64 bit, hãy xuất" 64 ". In bất kỳ chuỗi ký tự chữ và số không trống nào khác cũng không.". Điều này hoàn toàn không làm điều đó ...
Olivier Grégoire

4
Bạn có thể lấy Java 8 cho Windows 98 (v4.10) không?
TessellatingHeckler

4
@TessellatingHeckler Java 8 yêu cầu "i586" (bất kể điều đó có nghĩa là gì). Mục nói: "mã của bạn phải có khả năng chạy trên Windows 4.10 hoặc mới hơn", không phải "mã của bạn phải có khả năng chạy trên Windows 4.10 mới hơn". Nó chạy trên Windows mới hơn .
Olivier Grégoire


8

Windows CMD, 56 52 byte (cảm ơn Bob!)

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

Vẫn dài đáng ngạc nhiên - dài nhất cho đến nay!


1
Trên thực tế, %windir%\SysWOW64thậm chí còn ngắn hơn, tôi nghĩ ...
Bob

7
" Phải có khả năng chạy trên Windows 4.10 hoặc mới hơn và ít nhất một hương vị Linux mà bạn chọn " - hương vị nào của Linux cho điều này?
TessellatingHeckler

1
@TessellatingHeckler nếu bạn cài đặt Wine ...?
Ken YN

1
Còn việc sử dụng tốc ký thì sao? if EXIST "c:\Progra~3" (echo 64)else echo 32Theo mặc định, bạn có ProgramDataProgram Filesvì vậy nếu một phần ba tồn tại, chúng ta sẽ là 64
Marie

3
Điều này sẽ in gì cho một hệ điều hành 8 bit?
tuskiomi

7

API C, Win32, 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;}

Trên thực tế có hơn 2 trường hợp ở đây. Hãy xem xét chúng

  • Đơn giản nhất: IsWow64Processkhông tồn tại: Chúng tôi đang sử dụng HĐH 32 bit

Đối với hai trường hợp tiếp theo, chúng ta cần có kiến ​​thức rằng nhị phân của chúng ta sẽ là một tệp thực thi 32 bit. Và mô tả về những gì sẽ được đưa ra trong tham số raIsWow64Process

Một con trỏ tới một giá trị được đặt thành TRUE nếu quá trình đang chạy trong WOW64. Nếu quy trình đang chạy trong Windows 32 bit, giá trị được đặt thành FALSE. Nếu quy trình là một ứng dụng 64 bit chạy trong Windows 64 bit, giá trị cũng được đặt thành FALSE.

Điều đó khiến chúng tôi có thêm hai trường hợp:

  • IsWow64Process tồn tại và mang lại TRUE -> Chúng tôi đang ở trên máy 64 bit
  • IsWow64Process tồn tại và mang lại FALSE -> Chúng tôi đang ở trên máy 32 bit

Chúng tôi không quan tâm đến phần ứng dụng 64 bit trên Windows 64 bit mang lại FALSE. Như chúng ta biết rằng ứng dụng của chúng tôi là 32-bit

Ồ và có một trường hợp nữa không nằm trong thử thách này và dù sao cũng nên hiếm gặp:

  • IsWow64Process tồn tại, nhưng không thành công: Chúng tôi mặc định là máy 32 bit.

Điều này sẽ bao gồm hầu hết các hệ điều hành Windows NT. Chỉ thử nghiệm trên Win10 64-bit, Win 7 64-bit, Win 8.1 32-bit và WinXP SP1 32-bit


Câu trả lời gốc:

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

Để chắc chắn chúng ta chỉ cần phân biệt 2 trường hợp

  • IsWow64Process không tồn tại trong kernel32.dll => Chúng tôi đang ở trên máy 32 bit.

  • IsWow64Process không tồn tại => Chúng tôi đang ở trên một máy 64 bit.

Giá trị thực tế được cung cấp bởi IsWow64Processkhông liên quan đến giá trị này, vì chúng tôi muốn nhị phân là 32 bit trong mọi trường hợp.

Không giống như hầu hết các câu trả lời, điều này không phụ thuộc vào chính nhị phân được biên dịch trên máy mà nó được thực thi.

Nếu tôi biết một chức năng ngắn hơn chỉ có trên máy 64 bit chứ không phải máy 32 bit, tôi có thể rút ngắn câu trả lời.


2
Thả .dlltừ chuỗi tên mô-đun. Điều này không chỉ tốt cho việc chơi golf mà còn thực sự là một cách luyện tập tốt hơn trong sử dụng bình thường. Ngoài ra, với mục đích chơi gôn, bạn có thể thả không gian sau #include.
Cody Grey

Cảm ơn, tôi thực sự muốn giảm toàn bộ bằng cách chỉ tìm kiếm một mô-đun có thể tìm thấy trên 64 bit nhưng không phải trên 32 bit. Tôi vẫn đang nhìn. Đáng buồn thay (cho mục đích này) không có mô-đun gọi là WoW64.
MrPaulch

Thực sự có một wow64.dllWow64Win.dll, nhưng tôi chưa bao giờ thử gọi GetModuleHandlevới những người đó. Tuy nhiên, vấn đề là chúng sẽ chỉ được tải cho quy trình 32 bit chạy trên máy 64 bit, không phải cho quy trình 64 bit chạy trên máy 64 bit.
Cody Grey

Tôi có. Họ trả về 0 ngay cả trên máy 64 bit. Làm cho ý nghĩa thực sự. Chúng không tồn tại để được liên kết trực tiếp. Hệ thống đảm nhiệm việc chuyển hướng trong thời gian chạy.
MrPaulch

Ooh, vấn đề mặc dù. Từ tài liệu SDK: "Lưu ý rằng kỹ thuật này không phải là cách đáng tin cậy để phát hiện xem hệ điều hành có phải là phiên bản Windows 64 bit hay không vì Kernel32.dll trong các phiên bản Windows 32 bit hiện tại cũng có chức năng này."
Cody Grey

7

C #, 60 50 byte

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

Cảm ơn @TheLethalCoder


1
Chào mừng đến với trang web! :)
DJMcMayhem

4
Lưu 4 byte nếu bạn xóa 'Line'
John

1
cũng có thể xóa 'Môi trường.' và 'bàn điều khiển.' giả sử sử dụng using static System.Environment;using static System.Console;
John

1
đồng thời, đổi WriteLinethànhWrite
Thomas Ayoub

7
@ John Lần trước tôi đã kiểm tra, phải bao gồm nhập và vì vậy sẽ thêm vào số byte
Ceshion

6

Ruby, 22 byte

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

["any string"].pack("p")trả về một chuỗi có byte tương ứng với con trỏ trỏ "any string"và là 8 ký tự nếu HĐH là 64 bit hoặc 4 ký tự nếu HĐH là 32 bit.


Vì đây là sử dụng kích thước con trỏ, nên điều này sẽ in 32 bit khi trình thông dịch Ruby là nhị phân 32 bit trên HĐH 64 bit. Vì vậy, bỏ lỡ một quy tắc.
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.Vì vậy, người dùng 64 bit sẽ được cho là đang chạy Ruby 64 bit.
Mực giá trị

6

R, 16 byte

.Machine[[18]]*8

Trả về kích thước con trỏ.


1
Giống như tất cả các giải pháp kích thước con trỏ, điều này sẽ in kết quả sai khi chương trình là nhị phân 32 bit chạy trên HĐH 64 bit.
DarkDust

1
@DarkDust R được thông dịch và chúng tôi có thể giả sử người dùng sử dụng phần mềm 64 bit nếu có thể, do đó, cũng là một trình thông dịch 64 bit. IMHO, quy tắc chỉ áp dụng cho các ngôn ngữ được biên dịch
NieDzejkob

@NieDzejkob Đó là logic chính xác mà tôi đã sử dụng cho câu trả lời của mình trong PHP khi người khác đưa ra loại nhận xét tương tự để trả lời câu trả lời của tôi, tôi ước người khác đọc tương tự từ câu hỏi như chúng tôi cho rằng người dùng sẽ sử dụng 64- phần mềm bit khi có thể với các ngôn ngữ được giải thích.
Bja

6

Perl, 18 15 18 byte

say length pack p8

Tôi nhận được 64␤trên máy tính 32 bit của mình, vì perlđược xây dựng với IV 64 bit. Bạn sẽ thấy điều này thường xảy ra khi chạy trên phiên bản Windows 32 bit.
Brad Gilbert b2gills

@ BradGilbertb2gills Tôi đã hoàn nguyên mã về phiên bản trước; cái này nên hoạt động ngay cả trong trường hợp này Hãy cho tôi biết nếu nó vẫn không hoạt động, tôi sẽ xóa câu trả lời của tôi.
Grimmy

1
Điều đó hoạt động chính xác.
Brad Gilbert b2gills

Có vẻ sai trên HP 9000/785. Cung cấp 32. Nhưng tôi không nghĩ rằng có bất kỳ CPU HP / PA-RISC 32 bit nào.
Ole Tange

6

mã máy x86, 8 byte

31 C0 B0 40 48 24 60 C3

Ung dung:

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

Nếu được biên dịch dưới dạng thực thi 64 bit, nó trả về 64 in eaxvà nếu được biên dịch thành 32 bit, thì trả về 32 - bất kể HĐH.

Câu trả lời này dựa trên các quy tắc nói:

Bạn có thể cho rằng người dùng sẽ sử dụng phần mềm 64 bit bất cứ khi nào có thể.


Trong khi đây là một cách tiếp cận thú vị, làm thế nào nó có thể được viết vào một chương trình theo cách mà nó thực sự có thể được thực thi? Mọi phương pháp tôi có thể nghĩ đến khi thực thi mã nhị phân ngoài việc viết hàm nạp của riêng bạn sử dụng các tệp dành riêng cho mã 64 bit hoặc 32 bit. Do đó, bạn sẽ cần hai bản sao của mã này để thực sự chạy ...
Jules

@Jules Bạn có thể đặt nó dưới dạng lắp ráp nội tuyến vào một chương trình ngôn ngữ cấp cao, như ở đây . Sau đó, bạn chỉ cần sử dụng trình biên dịch gốc nền tảng của mình với các tùy chọn mặc định và bạn sẽ nhận được bitness.
Ruslan

@ l4m2 tại sao bạn mắng tôi? Nhưng dù sao bạn cũng đúng, hai byte này dường như là một số rác còn lại từ các thử nghiệm của tôi. Sẽ từ bỏ.
Ruslan

5

PHP, 18 byte

<?=PHP_INT_SIZE*8;

Điều này xử lý chính xác tất cả các trường hợp 32, 64 và các CPU bit khác với điều kiện PHP_INT_SIZE là chính xác, nó sẽ hiển thị kích thước chính xác của CPU cho dù CPU PHP đang chạy trên nền tảng nào!

Nếu PHP đang chạy

Hệ điều hành 32 bit PHP_INT_SIZE == 4,

Hệ điều hành 64 bit PHP_INT_SIZE == 8,

Hệ điều hành 16 bit PHP_INT_SIZE == 2 (về mặt lý thuyết)

Hệ điều hành 8 bit PHP_INT_SIZE == 1 (một lần nữa về mặt lý thuyết)

Hệ điều hành 128 bit PHP_INT_SIZE == 16 (Chưa đạt được nhưng có thể)


2
hằng số đó có kích thước của HĐH nơi PHP được xây dựng, không chạy
Einacio

2
@Einacio Có, nhưng trong thử thách ban đầu, người đăng đã viết "Bạn có thể cho rằng người dùng sẽ sử dụng phần mềm 64 bit bất cứ khi nào có thể", do đó, nếu HĐH là 64 bit thì phiên bản PHP chạy trên HĐH sẽ phải được giả định là được 64-bit! (Lưu ý: Tôi không xem đây là một lỗ hổng chỉ là logic thuần túy dựa trên thử thách ban đầu.)
Bja

4

C # (29 byte)

Console.Write(IntPtr.Size*8);

10
Giống như tất cả các giải pháp kích thước con trỏ, điều này sẽ in kết quả sai khi chương trình là nhị phân 32 bit chạy trên HĐH 64 bit.
DarkDust

1
Cần xác định rằng phần này được biên dịch cho "AnyCPU" với hộp kiểm "Ưu tiên 32 bit" không được chọn.
Cody Grey

4

PowerShell, 17 52 byte

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

Trả về 64 nếu một trong những điều sau là đúng:

  • Bạn có một thư mục trên ổ đĩa hiện tại của bạn với một tên tệp kết thúc bằng một paren gần, ý tưởng là để phát hiện Program Files (x86).
  • archtrả về một chuỗi kết thúc bằng 4(ASCII 52), như x86_64, trái ngược với ví dụ i686.

Việc bắt thử nhằm tránh lỗi bạn gặp phải nếu gci không trả về gì và bạn không có vòm . Tôi đã không tìm thấy một cách ngắn hơn để làm điều đó cho đến nay. gci được sử dụng trên ls vì trên Linux, ls sẽ tạo ra lỗi hiển thị.

Phiên bản này sẽ phát hiện xem HĐH có phải là 64 bit hay không chỉ là PowerShell và được thử nghiệm để hoạt động trên Windows và Linux. Để được hỗ trợ Mac, thay thế archbằng uname -m.

Phiên bản chỉ dành cho Windows trước đây: -!(ls \*`))*32+64


Điều gì linux distro này chạy trên?
tuskiomi

@tuskiomi Ôi, xấu quá - Tôi hiểu ý của bạn. Không đọc thử thách đúng cách. Tôi có nên xóa câu trả lời?
Andy C.

Nếu bạn biết nó sẽ hoạt động với RƯỢU, bạn nên giữ nó.
tuskiomi

@tuskiomi Ít nhất là Ubuntu 14.04, 16.04, RHEL7, CentOS7 và một số phiên bản của SUSE: github.com/PowerShell/PowerShell/release
Xudonax

4

Swift 4 REPL / Sân chơi, 12 byte

Int.bitWidth

Intcó kích thước từ, hoạt động như một Int32hoặc Int64tùy thuộc vào hệ thống.


Đây không phải là một mã snip nó, vì vậy nó nên in? Hoặc nói rằng bạn đang sử dụng REPL có được xung quanh hạn chế đó không?
Lyndon White

1
Điều đó tùy thuộc vào các thẩm phán. Việc sử dụng REPL không phổ biến lắm, nhưng Swift Playground rất phổ biến (đặc biệt là trên iPad). Cá nhân, tôi nghĩ đó là trò chơi công bằng. Mọi người thiết kế các ngôn ngữ lập trình tùy chỉnh để chơi golf in ngầm các giá trị và điều này không khác
Alexander

4

Ruby, 10 byte

p 0.size*8

Mặc dù Ruby có thể sử dụng các số nguyên có độ dài bất kỳ, bên trong nó lưu trữ các giá trị phù hợp với một từ máy như Fixnum. Phương thức Fixnum#sizeluôn trả về độ dài tính bằng byte của một từ máy.

Các Fixnumlớp đã được gỡ bỏ trong Ruby 2.4.0, chức năng của nó đã được đưa vào lớp học Integer. Các mã đứng.


4

Shell, 26 byte

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

Bạn có thể sử dụng archthay vì uname -m.
Dennis

1
@Dennis Không nhất thiết. Trên macos: uname -m-> x86_64, nhưng arch-> i386. Bởi vì macos :( Ngoài ra, đây là đặc thù của bash - thất bại trên zsh.
viraptor

@StevenPenny zshsẽ cố gắng diễn giải ?dưới dạng ký tự đại diện toàn cầu / ký tự đơn.
Doorknob

Cái này có chạy trên Windows không?
Ajasja

1
@Ajasja với Cygwin
Steven Penny

4

Bash, 25 17 byte

getconf LONG_BIT

Cảm ơn Dennis đã giúp đỡ chơi golf.


4

C, 22 byte

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

Đây là một câu trả lời dựa trên kích thước con trỏ giả định nhị phân nguyên gốc. Các 0được đúc đến int**(địa chỉ 0x0). Sau đó, chúng tôi thêm 8 đến 0, trong C tiến bộ, con trỏ theo sizeof(int*)*8. 4 byte * 8 bit = 32, 8 byte * 8 bit = 64. Vì vậy, chúng tôi nhận được (int**)0x200x40 sau đó được ngầm định là số nguyên bằng cách trả lại chúng từ một hàm hoàn toàn ẩn int.

C, độc lập, 34 byte

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

C, vui với Unicode, 30 điểm mã, 34 byte (UTF-8)

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

Tôi đã cố gắng hiểu làm thế nào điều này hoạt động, nhưng tôi không biết gì. Bạn có thể thêm một lời giải thích?
NieDzejkob

@jbcreix thông minh ...
NieDzejkob

3

Java, 50 byte

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


Có phải đó là một thư viện? Nếu có, bạn nên đề cập đến nó! Mặc dù vậy, tôi không thấy lớp đó có sẵn trong JDK 8 của Oracle (tôi không có JDK 6 và 7 thông thường theo ý của mình, atm).
Olivier Grégoire

2
Câu trả lời này không hợp lệ. Nó không in.
Philipp

6
Trích dẫn Dennis:> Nó cũng nói rằng các quy tắc golf mã thông thường được áp dụng và việc trở về từ một chức năng là một phần trong các mặc định của chúng tôi cho I / O.
Asu

Thay đổi nó thành một hàm ()->com.sun.jna.Native.POINTER_SIZE*8
lamba

3

PHP, 29 byte

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

https://3v4l.org/Y6JXv


Ôi. Tôi thích cái này. Làm thế nào nó hoạt động?
tuskiomi

4
php_uname('m')trả x86_64về hệ điều hành 64 bit, nếu không thì giống như vậy i386. 4là ký tự thứ 6 (thứ 5 0 được lập chỉ mục) của chuỗi , '4' - 4 == 0 == false. Và @chỉ cần loại bỏ các cảnh báo cho các chuỗi không được trích dẫn và các offset chưa được khởi tạo.
Petah

2
Điều này phát hiện kiến ​​trúc của PHP, không phải của HĐH. Tôi đang chạy PHP 32 bit trên Windows 64 bit, php_uname('m')trả về 'i586'.
Gras Double

@GrasDouble tôi đoán ymmv, tôi làm việc cho tôi với Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah

1
@tuskiomi cái này sẽ in 64 nếu có hệ điều hành 8 bit
Bja

3

Python 3 , 77 84 71 59 byte

-13 byte, cảm ơn @Jonathan ALLan!
Xuống tới 59 bởi @Clearer

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

Hãy thử trực tuyến!

Cú đánh mã thời gian nắm tay của tôi :)
Nên xuất phiên bản chính xác ngay cả khi chạy 32Bit-Python trên hệ điều hành 64 bit.
Giả sử platform.machine()cho i*86hoặc x86cho 32Bit-OS. Tôi không có sẵn để kiểm tra cái này. Đầu ra là 0khi HĐH không ở chế độ 64 / 32Bit
Chỉnh sửa: Đã thêm câu lệnh in, do đó, nó có thời lượng dài hơn 7 byte


Không chắc có thể chấp nhận được hay không vì có thể chạy HĐH 32 bit trên máy 64 bit (hoặc có một số máy được gọi foo86là 64 bit: p), nhưng nếu chấp nhận được thì bạn có thể lưu 9 (chỉnh sửa .. .13!) Byte với print((a==64)*a+32*(a==86)).
Jonathan Allan

from platform import*;print({'4':64,'6':32}[machine()[-1]])cũng sẽ làm việc
Rõ ràng hơn

@Clearer Điều này sẽ bỏ lỡ các ràng buộc sau: Quan trọng: In bất kỳ chuỗi ký tự chữ và số không trống nào khác nếu nó không phải là 32 hoặc 64 bit. .
tOmAtE

@tOmAtE nếu không phải 32 hay 64 bit, nó sẽ đưa ra một ngoại lệ, in ra một chuỗi không trống.
Rõ ràng

2
Hãy thử architecture (), lưu dict: from platform import*;print(architecture()[0][:2])-> 50 byte
bugmenot123
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.