OS가 32 비트 또는 64 비트입니까?


52

더 이상 중요하지 않지만 때때로 누군가 가 알아야합니다.

간단한 골프는 다음과 같습니다. 사용자 입력을받지 않고 코드가 실행되는 컴퓨터가 64 비트 운영 체제인지 아니면 32 비트 운영 체제인지 알려주십시오!

코드가 32 비트 운영 체제에서 실행되면 "32"를 인쇄하고 코드가 64 비트 운영 체제에서 실행되면 "64"를 출력하십시오. 중요 : 32 비트 또는 64 비트가 아닌 경우 비어 있지 않은 영숫자 문자열을 인쇄하십시오.

64 비트 운영 체제가있는 컴퓨터에서 실행중인 32 비트 프로그램은 "64"를 출력해야합니다. 사용자는 가능할 때마다 64 비트 소프트웨어를 사용한다고 가정 할 수 있습니다.

참가 자격을 얻으려면 코드가 Windows 4.10 이상 또는 최신 Microsoft 지원 Windows 시스템과 원하는 Linux 중 하나 이상 을 실행할 수 있어야합니다 . 프로그램이 여전히 올바른 값을 반환하는 한 호환성 모드를 설치할 수 있습니다.

일반적인 규칙이 적용됩니다.

참고 : 귀하의 답변이 32 또는 64 만 인쇄하고 alt 경우는 인쇄하지 않으면 받아 들일 것이지만 경쟁 답변은 아닙니다.

나중에 다른 OS에서 이러한 코드를 실행 한 결과를 게시하고 게시하겠습니다!


5
따라서 "64 비트 운영 체제가 설치된 컴퓨터에서 실행되는 32 비트 프로그램은"64 "를 출력해야합니다. 가능하면 사용자가 64 비트 소프트웨어를 사용한다고 가정 할 수 있습니다." 인터프리터 / 컴파일러 등을 32 비트와 64 비트로 모두 사용할 수있는 경우 32 비트 OS는 항상 32 비트 버전의 인터프리터 등을 실행하며 64 비트 OS는 항상 64 비트 인터프리터를 실행합니다. /기타. 그래서 32 또는 64, 32 또는 64 인 OS 인 프로그램의 차이에 대한 걱정, 기본적으로 단지 32 비트 구현에 언어 문제. 권리?
Lyndon White

2
32 비트 컴파일러를 사용하여 프로그램을 컴파일하는 경우 64 비트 OS에서 많은 솔루션이 "32"를 인쇄합니다. 이거 괜찮아?
Martin Rosenau 2016 년

15
세계에서 "Windows 4.10"은 무엇입니까? 이것이 Windows 98을 의미합니까? 아니면 Windows NT 4를 의미합니까? 그보다 "최신"이라고 생각하는 것은 무엇입니까? 이것은 예외적으로 생각하기 어려운 도전으로 보입니다 .
코디 그레이

13
"공식 창 사양"은 없으며 Windows 98을 "Windows 4.10"으로 언급하는 사람없습니다 . 당신은 말 그대로 첫 번째입니다. 따라서 버전 번호를 사용하여 시원하거나 공식적으로 소리를내는 대신 실제 제품 이름 만 사용해야합니다 . 그건 그렇고, Windows 9x는 64 비트 빌드에서 사용할 수 없었으므로 실제로 Windows 98에서만 실행되고 "32"를 반환하는 항목을 제출하는 것이 합법적입니까? 매우 불공평 한 / 비 스포츠 / 재미없는 것처럼 보이지만 기술적으로 규칙에 따라 허용됩니다.
코디 그레이

3
여전히 Windows 버전에 대한 질문에 답변하지 않았습니다. 않는다 윈도우 4.10 이상에서 실행할 수 있어야합니다 평균 윈도우 4.10 모든 새로운 버전 또는 단일 Windows 버전 4.10 이상에 ?
Dennis

답변:


45

x86 어셈블리 (폴리 글 로트), 13 바이트

바이트 코드 :

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

32 비트로 해석 될 경우 32, 64 비트 인 경우 64, 16 비트 인 경우 32767을 해석하는 함수를 정의합니다.

Windows와 Linux에서 실행되는 폴리 글 로트를 만들고 싶었지만 생각보다 훨씬 어렵습니다. 16 비트가 아닌 Windows에서 링크하지 않고 값을 인쇄하는 방법조차 확실하지 않습니다.

설명

이 코드는 두 개의 tell을 사용하여 실행중인 아키텍처를 결정합니다. 첫 번째는 0x48 명령어이며 16 비트와 32 비트는 dec %eax64 비트에서는 명령어 크기 접두사입니다. 두 번째 tell은 동일한 명령어이지만 0x8000 값에서 실행할 때 레지스터 크기가 16 비트 인 경우에만 최상위 비트가 뒤집혀 오버플로 플래그를 설정하고 사용할 수 있습니다 jo.

16 비트에서이 코드는 다음과 같이 해석됩니다.

   0:   31 c0                   xor    %ax,%ax    /* 0x0000 */
   2:   b4 80                   mov    $0x80,%ah  /* 0x8000 */
   4:   48                      dec    %ax        /* 0x7fff */
   5:   70 05                   jo c              /* taken  */
   7:   04 40                   add    $0x40,%al
   9:   83 e0 60                and    $0x60,%ax
   c:   c3                      ret               /* 0x7fff */

32 비트에서이 코드는 다음과 같이 해석됩니다.

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48                      dec    %eax        /* 0x00007fff */
   5:   70 05                   jo c               /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00007f3f */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000020 */
   c:   c3                      ret

64 비트에서이 코드는 다음과 같이 해석됩니다.

   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

이것은 실제로 아마도 선두에, 아주 좋은 것입니다
tuskiomi

1
매우 깔끔한 아이디어이지만 구현 된대로 32 비트 바이너리로 어셈블되어 64 비트 운영 체제에서 실행되는 경우 잘못된 값을 반환합니다.
코디 그레이

규칙의 @CodyGray : 사용자는 가능할 때마다 64 비트 소프트웨어를 사용한다고 가정 할 수 있습니다. 이것은 또한 함수의 경우 가능한 한 호출자 코드가 64 비트라고 가정 할 수 있음을 의미한다고 가정합니다.
Ruslan

아, 나는 그것이 공정한 해석이라고 생각합니다, @Ruslan. 그리고 나는 당신이 이미 내가 생각한 대답을 게시 한 것을 보았습니다 .이 문제에 대한 것이 아닙니다. :-) 당신은 내 공감대를 얻었습니다.
코디 그레이

바이트는 않습니다 48대표 dec %eax16 비트 모드로?
phuclv

49

x86 기계 코드, 12 바이트

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

언 골프 드 :

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

이 기능은 ELF32에서 i386 SysV ABI 다음에 Linux에서, PE32에서 stdcall호출 규칙에 따라 Windows / Wine에서 사용될 때 작동 합니다.


실제로 다른 접근법을 따르면 바이트 수를 훨씬 줄일 수 있습니다 .
Ruslan

32/64 비트가 아닌 환경에서 이론적으로 이것은 무엇입니까?
tuskiomi 2016 년

1
@tuskiomi 어쨌든이 코드는 여전히 32 또는 64를 반환합니다. 16 비트 모드에서이 바이트 시퀀스를 해석하는 유일한 차이점은 니모닉을에서 eax로 변경하는 것입니다 ax. 따라서 선택자가 인 cs경우 0x23결과는 64, 그렇지 않으면 32입니다.
Ruslan

그러나 이것은 두 가지 특정 운영 체제에만 해당됩니다. cs = 0x23 인 32 비트 시스템을 쉽게 가질 수 있습니다. 대신 CPU를 대상으로하는 8 바이트 답변을 참조하십시오.
피터 페리 2013

@ peterferrie 그래, 그게 또 다른 대답 이있는 이유 입니다. 그러나 당신은 2 바이트만큼 능가합니다.
Ruslan

32

매스 매 티카, 17 바이트

$SystemWordLength

13
물론 내장되어 있습니다! \ s (+1)
tuskiomi 2016 년

를 추가 &하거나 이것이 REPL에 있음을 지정 해서는 안 됩니까?
LegionMammal978

5
@ LegionMammal978 "코드가 32 비트 운영 체제에서 실행되면"32 "를 인쇄하고, 코드가 64 비트 운영 체제에서 실행되면"64 "를 출력하십시오. 비어 있지 않은 영숫자 문자열을 인쇄하십시오. 그렇지 않다면. " "실행할 때이를 수행하는 기능을 제공하지 마십시오"; 그냥 "해라".
패트릭 스티븐스

17
@PatrickStevens : 질문에 제출 양식을 지정하지 않으면 기본적으로 프로그램이나 기능이지만 스 니펫은 아닙니다 .

3
@ ais523 Mathematica에는 프로그램, 기능 및 스 니펫 사이에 차이가 없다고 주장합니다. 모든 것은 단지 표현 일뿐입니다.
ngenisis

21

부트 로더

GRUB과 IPXE 모두 런타임에 Turing의 완전한 프로그래밍 언어에 액세스 할 수 있다는 것을 알고 있습니까? Syslinux 부트 로더 제품군은 그렇지 않지만이를 수행 할 수 있습니다.

IPXE, 36 바이트

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

스크립트가 원격으로 실행되는 경우 첫 번째 행이 필요하지만 명령 행에 직접 입력 된 경우에는 그렇지 않습니다.

GRUB, 42 바이트

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

Syslinux, 186 바이트

첫 번째 파일은 syslinux.cfg (또는 isolinux.cfg 등)의 세 파일을 가져옵니다.

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

및 t.cfg

menu title 32

ans s.cfg

menu title 64

이를 위해 어려운 부분은 syslinux에 간단한 텍스트 표시 기능이 없으므로 메뉴가 남용된다는 것입니다.


부트 로더와 OS의 해상도를 말할 수 있는지 확실하지 않습니다,하지만 난 생각처럼
tuskiomi

CPU를 확인하고 올바른 운영 체제를 선택하는 데 사용됩니다. 이것은 기본적으로 내 부팅되지 않은 프로젝트의 골프 코드입니다.
hildred

2
따라서 아키텍처에 따라 운영 체제가 변경됩니다. 틀을 깨고 생각하라. 나는 좋아한다.
tuskiomi 2016 년

바이트 수는 얼마입니까?
Restioson 2016 년

1
@hildred 나는 당신이 ## iPXE, 36 bytes대신 사용한다면 더 읽기 쉽다고 믿는다### ipxe 36
NieDzejkob

21

줄리아 14 13 바이트

n->8sizeof(1)

설명:

  • Anon 함수, nothing정수 32 또는 64를 반환하는 (포함 )
  • 정수 리터럴 타입 인 Int32 비트 또는 64 비트가 하나 인 경우 따라 Int32또는 Int64합니다 ( 1임의의 숫자 일 수)
  • 함수 호출이 병렬 곱하기 전에 숫자를 배치
  • 이것은 기본적으로 rahnema1의 답변에 사용되는 코드Sys.WORD_SIZE 의 축소 버전입니다.

다른 재미있는 답변은입니다 ()->"$(Int)"[4:5].하지만 그 답변을 세울 수는 없습니다.


@Roman Gräf 덕분에 -1


더미 인수를 사용할 수 있습니다 : codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

줄리아, 20 17 16 바이트

n->Sys.WORD_SIZE

* @LyndonWhite 덕분에 3 바이트를 저장했습니다 * @ RomanGräf 덕분에 바이트를 저장했습니다

이전 답변 :

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

온라인으로 사용해보십시오!


1
나는 개인적으로 이것처럼!
tuskiomi 2016 년

2
규칙을 준수함으로써 : codegolf.meta.stackexchange.com/q/2419/62131 당신이 수행하여 3 바이트를 면도 할 수 있습니다()->Sys.WORD_SIZE
린든 화이트

1
더미 인수를 사용할 수도 있습니다 : codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

자바 스크립트 (Node.js), 24 바이트

_=>process.arch.slice(1)

이 함수 및 반환 '32', '64'또는 둘 경우 'rm'.


+1이지만 64 비트 아치가 32 비트 OS를 실행할 수 있다고 가정합니다.
Octopus

1
32 비트 Windows에서 '32'를 제공하므로 작동하는 것처럼 보입니다.
Ken YN

5
REPL을 사용하는 os대신 다음 대신에 7 바이트를 줄일 수 있습니다 process.os.arch().slice(1)
GilZ

이는 실제 OS 아키텍처가 아닌 프로세스에보고 된 OS 아키텍처를 반환합니다. 따라서 이것은 Linux에서 작동하지 않습니다. (당신의 마음에 드는 검색 엔진에 펀치 "같이 setarch".)
데이비드 슈워츠

@DavidSchwartz 내가 오해하지 않는 한 내 리눅스 박스에서 잘 작동하지만 PPCG에서는 사용자가 아치를 변경한다는 측면에서 수정되지 않은 환경을 가정 할 수 있습니다.
Downgoat

12

C, 33 31 29 23 바이트

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

골프 팁을 준 댓글 작성자 @ceilingcat와 @Dennis에게 감사드립니다!


13
또한 일반적인 코드 골프 규칙이 적용되며 함수에서 복귀하는 것이 I / O 기본값의 일부라고 말합니다.
Dennis

11
32 비트 또는 64 비트 프로그램으로 컴파일할지 여부에 따라 달라지지 않습니까?
Ken YN

4
이는 요구 사항을 준수하지 않습니다. " 64 비트 운영 체제가 설치된 컴퓨터에서 실행되는 32 비트 프로그램은"64 "를 출력해야합니다. "이것은 OS가 아니라 프로그램이 컴파일 된 방법을 알려줍니다.
David Schwartz

2
@DavidSchwartz "사용자는 가능하면 64 비트 소프트웨어를 사용한다고 가정 할 수 있습니다."
Klas Lindbäck

2
안타깝지만 sizeof는 컴파일 타임에 평가됩니다. 따라서 32 비트 exe를 컴파일하여 64 비트 시스템에서 실행하면 64를 출력하는 동안 32를 출력합니다 ( stackoverflow.com/questions/2615203/… ). 그래도 좋은 생각입니다!
Dinaiz 2016 년

11

PowerShell, 16 바이트

8*[IntPtr]::Size

포인터 크기 (바이트)를 가져오고 비트를 얻으려면 8을 곱합니다.


-1 때문에your code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r 또는 , 새로운되지 새로운. 오랫동안 지원되지 않는 Windows 버전에서 실행하기가 어려울 것입니다. 그것은 사람들이 모든 운영체제의 98에서 테스트를 기대하는 것이 무리 - 그것은 요즘 VM에 설치도 쉬운 일이 아니다. (KVM에 날 믿어, 내가 해봤하지거야 실행, 그리고이 흥미 VBox의 디스플레이 어댑터와 상호 작용) . (아무도 64 비트라는 개념도 가지고 있지 않습니다. 그것은 정말로 우스운 요구입니다.)
Bob

1
@ ub3rst4r 여기서 해석 된 모든 프로그래밍 언어가 Windows 4.10에서 작동하는 구현을 가지고 있는지 의심합니다!
Martin Rosenau 2016 년

1
64 비트 OS에서 32 비트 powershell 인 경우 실패한 것 같습니다.
Chris J

@ChrisJ 적어도 Win10 및 Win2012 R2에서는 x86 PowerShell에서 적절한 결과를 반환합니다. Linux에서 테스트하지 않았습니다.
Booga Roo 2016

10

파이썬 2, 52, 48, 42 41 바이트

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

전적으로 인간에게 감사합니다!


줌! 1 분 안에 줄을 가로 질러
tuskiomi 2016 년

집에 올 때까지 테스트를 보류 할 것이지만 이것이 "32"와 "64"를 출력하는지 확실하지 않지만 다른 경우에는 확신합니다.
tuskiomi 2016 년

@tuskiomi, 이것은 "32bit"또는 "64bit"를 출력합니다
Daniel

1
from struct import*;print calcsize("P")*8더 짧습니다.
완전히 인간적인

12
64 비트 OS의 32 비트 Python에서 이것을 실행하면 이것이 당신에게 있다고 생각합니다. 대부분의 다른 답변도 어쨌든 그 점에 민감 해 보입니다 ...
Nick T

10

자바 8, 45 바이트

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

@Dopapp 그가 의미하는 것은 이것이 프로그램이나 함수가 아니라 코드 조각이라는 것입니다. Java 8에서는 다음과 같이 작동합니다.n=>System.getProperty("os.arch")
NoOneIsHereNo

@NoOneIsHere, 오, 고마워요 – 고마워요
Daniel

2
"코드가 32 비트 운영 체제에서 실행 된 경우"32 "를 인쇄하고, 코드가 64 비트 운영 체제에서 실행 된 경우"64 "를 출력하십시오. 비어있는 영숫자 문자열을 인쇄하십시오 둘 다. " 이것은 전혀 그렇게하지 않습니다 ...
Olivier Grégoire

4
Windows 98 (v4.10) 용 Java 8을 구할 수 있습니까?
TessellatingHeckler 2016 년

4
@TessellatingHeckler Java 8에는 "i586"이 필요합니다 (무엇이든). 항목은 말한다 : "코드가 윈도우 4.10에서 실행할 수 있어야합니다 이나 하지"코드가 윈도우 4.10에서 실행할 수 있어야합니다, 새 " 새로운". Windows 최신 버전 에서 실행됩니다 .
Olivier Grégoire 7


8

Windows CMD, 56 52 바이트 (Bob 덕분에!)

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

아직도 놀랍게도 길다 – 지금까지 가장 긴!


1
실제로, %windir%\SysWOW64훨씬 짧습니다.
Bob

7
" 는 Windows 4.10 이상에서, 그리고 적어도 하나의 Linux 버전을 선택하여 실행할 수 있어야합니다 .
TessellatingHeckler

1
와인을 설치하면 @TessellatingHeckler ...?
Ken YN

1
속기를 사용하는 것은 어떻습니까? if EXIST "c:\Progra~3" (echo 64)else echo 32기본적으로 당신은 가지고 ProgramData있고 Program Files따라서 세 번째가 존재한다면, 우리는 64
Marie

3
8 비트 OS 용으로 무엇을 인쇄합니까?
tuskiomi 2016 년

7

C, Win32 API, 103 183 바이트

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

실제로 여기에는 2 가지 이상의 사례가 있습니다. 그들을 살펴 보자

  • 가장 쉬운 것 : IsWow64Process존재하지 않습니다 : 우리는 32 비트 OS에 있습니다.

다음 두 경우에는 바이너리가 32 비트 실행 파일이라는 것을 알아야합니다. 그리고 out 매개 변수에 무엇이 포함 될지에 대한 설명IsWow64Process

프로세스가 WOW64에서 실행중인 경우 TRUE로 설정되는 값에 대한 포인터. 프로세스가 32 비트 Windows에서 실행중인 경우 값은 FALSE로 설정됩니다. 프로세스가 64 비트 Windows에서 실행중인 64 비트 응용 프로그램 인 경우 값도 FALSE로 설정됩니다.

두 가지 경우가 더 있습니다.

  • IsWow64Process 존재하고 TRUE를 산출합니다-> 우리는 64 비트 머신에 있습니다
  • IsWow64Process 존재하고 FALSE를 산출합니다-> 우리는 32 비트 머신에 있습니다

64 비트 Windows에서 64 비트 응용 프로그램이 FALSE를 생성하는 부분에 대해서는 걱정하지 않습니다. 우리 는 우리의 응용 프로그램이 32 비트임을 알고

아, 그리고이 도전에 의해 다루어지지 않고 어쨌든 드 물어야 할 하나의 추가 사례가 있습니다 :

  • IsWow64Process가 있지만 실패합니다. 기본적으로 32 비트 시스템입니다.

대부분의 Windows NT 운영 체제를 다루어야합니다. Win10 64 비트, Win 7 64 비트, Win 8.1 32 비트 및 WinXP SP1 32 비트에서만 테스트되었습니다.


원래 답변 :

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

확실히 두 가지 경우 만 구별해야합니다.

  • IsWow64Process kernel32.dll에 존재하지 않습니다 => 우리는 32 비트 머신에 있습니다.

  • IsWow64Process 존재합니다 => 우리는 64 비트 머신에 있습니다.

IsWow64Process우리가 제공하는 실제 값 은 바이너리에 32 비트가되기를 원하기 때문에이 challange와 관련이 없습니다.

대부분의 답변과 달리 이것은 바이너리 자체가 실행되는 컴퓨터에서 컴파일되는 것에 의존하지 않습니다.

32 비트 시스템이 아닌 64 비트에만 존재하는 더 짧은 기능을 알고 있다면 답을 단축 할 수 있습니다.


2
.dll모듈 이름 문자열에서를 삭제하십시오 . 이것은 골프에 좋을뿐만 아니라 실제로 사용하는 것이 더 좋습니다. 또한 골프 목적으로을 (를) 후에 공간을 삭제할 수 있습니다 #include.
코디 그레이

고맙게도 실제로 64 비트에서는 찾을 수 있지만 32 비트에서는 찾을 수없는 모듈을 찾아서 모든 것을 줄이려고했습니다. 아직도 찾고 있어요 슬프게도 (이 목적으로) WoW64라는 모듈이 없습니다.
MrPaulch 2016 년

이 사실입니다 wow64.dll그리고 Wow64Win.dll,하지만 난 전화를 해본 적이 GetModuleHandle사람들과. 문제는, 그러나, 그들은 단지, 64 비트 시스템에서 실행중인 32 비트 프로세스에로드 될 것입니다 없는 64 비트 시스템에서 실행중인 64 비트 프로세스.
코디 그레이

나는 가지고있다. 64 비트 컴퓨터에서도 0을 반환합니다. 실제로 의미가 있습니다. 그것들은 직접 연결되어 존재하지 않습니다. 시스템은 런타임 동안 리디렉션을 처리합니다.
MrPaulch 2016 년

아, 그래도 문제. SDK 문서에서 : "현재 32 비트 Windows 버전의 Kernel32.dll에도이 기능이 포함되어 있기 때문에이 기술은 운영 체제가 Windows 64 비트 버전인지 여부를 감지하는 신뢰할 수있는 방법이 아닙니다."
코디 그레이

7

C #, 60 50 바이트

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

감사합니다 @TheLethalCoder


1
사이트에 오신 것을 환영합니다! :)
DJMcMayhem

4
'Line'을 제거하면 4 바이트 저장
John

1
'환경'을 제거 할 수도 있습니다. 그리고 '콘솔'. 의 사용을 가정 using static System.Environment;하고using static System.Console;
John

1
또한, 변경 WriteLineWrite
토마스 아 유브

7
@John 마지막으로 확인했을 때, 수입이 포함되어야하고 바이트 수에 추가 될 것입니다
Ceshion

6

루비, 22 바이트

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

["any string"].pack("p")바이트가을 가리키는 포인터에 해당 "any string"하고 OS가 64 비트 인 경우 8 자, OS가 32 비트 인 경우 4자인 문자열을 반환합니다.


이것은 포인터 크기를 사용하기 때문에 Ruby 인터프리터가 64 비트 OS에서 32 비트 바이너리 인 경우 32 비트를 인쇄합니다. 규칙이 그리워요
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.따라서 64 비트 사용자는 64 비트 Ruby를 실행한다고 가정합니다.
Value Ink

6

R, 16 바이트

.Machine[[18]]*8

포인터 크기를 반환합니다.


1
모든 포인터 크기 솔루션과 마찬가지로 프로그램이 64 비트 OS에서 실행되는 32 비트 바이너리 인 경우 잘못된 결과를 인쇄합니다.
DarkDust 2016 년

1
@DarkDust R은 해석되며 사용자가 가능한 경우 64 비트 소프트웨어를 사용한다고 가정 할 수 있으므로 64 비트 인터프리터도 가능합니다. IMHO,이 규칙은 컴파일 된 언어에만 적용
NieDzejkob

@NieDzejkob 다른 사람이 내 대답에 대한 응답으로 동일한 유형의 주석을 넣을 때 PHP에서 내 대답에 사용한 것과 동일한 논리입니다. 다른 사용자가 64를 사용할 것이라고 가정 할 때와 같이 질문에서 같은 내용을 읽기를 바랍니다. 해석 가능한 언어로 가능한 비트 소프트웨어.
Bja

6

펄, 18 15 18 바이트

say length pack p8

내가 얻을 수 64␤있기 때문에, 내 32 비트 컴퓨터에서 perl64 비트 IV로 지어졌습니다. 일반적으로 32 비트 버전의 Windows에서 실행하는 경우입니다.
브래드 길버트 b2gills

@ BradGilbertb2gills 코드를 이전 버전으로 되돌 렸습니다. 이 경우에도 작동해야합니다. 그래도 작동하지 않으면 알려주세요. 답변을 삭제하겠습니다.
Grimmy

1
제대로 작동합니다.
브래드 길버트 b2gills

HP 9000/785에서 잘못된 것 같습니다. 32를 제공하지만 32 비트 HP / PA-RISC CPU가 있다고 생각하지 않습니다.
Ole Tange

6

x86 기계 코드, 8 바이트

31 C0 B0 40 48 24 60 C3

언 골프 드 :

31 c0    xor eax,eax
b0 40    mov al, 0x40
48       dec al — in 32-bit mode; "REX.W" in 64-bit mode (ignored)
24 60    and al, 0x60
c3       ret

64 비트 실행 파일로 eax컴파일 된 경우 64 in 을 반환하고 32 비트로 컴파일 된 경우 OS에 관계없이 32를 반환합니다.

이 답변은 다음과 같은 규칙에 따릅니다.

사용자는 가능할 때마다 64 비트 소프트웨어를 사용한다고 가정 할 수 있습니다.


이것은 흥미로운 접근 방법이지만 실제로 실행할 수있는 방법으로 프로그램에 작성하는 방법은 무엇입니까? 자신의 로더 함수를 작성하는 것 이외의 이진 코드 실행을 생각할 수있는 모든 방법 은 64 비트 또는 32 비트 코드에 특정한 파일을 사용합니다. 따라서 실제로 실행하려면이 코드의 사본 두 개가 필요합니다.
Jules

@Jules 여기 와 같은 고급 언어 프로그램에 인라인 어셈블리로 넣을 수 있습니다 . 그런 다음 기본 옵션과 함께 플랫폼 네이티브 컴파일러를 사용하면 비트가 생깁니다.
Ruslan

@ l4m2 왜 나 한테 소리 지르 니? 그러나 당신은 어쨌든,이 두 바이트는 내 실험에서 남은 정크 것으로 보입니다. 제거합니다.
Ruslan

5

PHP, 18 바이트

<?=PHP_INT_SIZE*8;

이것은 PHP_INT_SIZE가 정확하다면 32, 64 및 기타 비트 CPU의 모든 경우를 올바르게 처리합니다 .PHP가 어떤 CPU PHP에서 실행 중인지에 관계없이 정확한 CPU 크기를 보여줍니다!

PHP가 실행중인 경우

32 비트 OS PHP_INT_SIZE == 4,

64 비트 OS PHP_INT_SIZE == 8,

16 비트 OS PHP_INT_SIZE == 2 (이론적으로)

8 비트 OS PHP_INT_SIZE == 1 (이론적으로도)

128 비트 OS PHP_INT_SIZE == 16 (아직 달성되지는 않았지만 가능)


2
이 상수는 PHP가 빌드 된 OS의 크기를 갖습니다.
Einacio

2
@Einacio 네,하지만 초기 도전에서 포스터는 "가능한 경우 사용자가 64 비트 소프트웨어를 사용한다고 가정 할 수 있습니다"라고 썼습니다. 따라서 OS가 64 비트 인 경우 OS에서 실행되는 PHP 버전은 다음과 같아야합니다. 64 비트가 되세요! (참고 : 나는 이것을 초기 도전에 기반한 순수한 논리의 허점으로 보지 않는다.)
Bja

4

C # (29 바이트)

Console.Write(IntPtr.Size*8);

10
모든 포인터 크기 솔루션과 마찬가지로 프로그램이 64 비트 OS에서 실행되는 32 비트 바이너리 인 경우 잘못된 결과를 인쇄합니다.
DarkDust 2016 년

1
"32 비트 선호"체크 상자를 체크하지 않은 채 "AnyCPU"에 대해 컴파일되도록 지정해야합니다.
코디 그레이

4

PowerShell, 17 52 바이트

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

다음 중 하나에 해당하면 64를 반환합니다.

  • 현재 드라이브에 파일 이름이 가까운 paren으로 끝나는 디렉토리가 있습니다 Program Files (x86).
  • arch예와 반대로 4(ASCII 52)로 끝나는 문자열을 반환합니다 .x86_64i686

try-catch는 gci 가 아무것도 반환하지 않고 아치 가없는 경우 발생하는 오류를 피하기위한 것 입니다. 지금까지 더 짧은 방법을 찾지 못했습니다. Linux에서는 ls 에 가시적 인 오류가 발생 하므로 gcils 보다 많이 사용됩니다 .

이 버전은 OS가 PowerShell이 ​​아닌 64 비트인지 감지해야하며 Windows 및 Linux에서 작동하도록 테스트되었습니다. 맥 지원에 대한 교체 arch와 함께 uname -m.

이전 Windows 전용 버전 : -!(ls \*`))*32+64


이것은 어떤 리눅스 배포판에서 실행됩니까?
tuskiomi 2016 년

@tuskiomi 오, 내 나쁜-무슨 말인지 알 겠어. 도전 과제를 제대로 읽지 못했습니다. 답을 삭제해야합니까?
Andy C.

WINE과 함께 작동한다는 것을 알고 있다면 보관해야합니다.
tuskiomi 2016 년

@tuskiomi 최소한 우분투 14.04, 16.04, RHEL7, CentOS7 및 일부 SUSE 버전 : github.com/PowerShell/PowerShell/releases
Xudonax

4

스위프트 4 REPL / 놀이터, 12 바이트

Int.bitWidth

Int단어 크기이며 시스템에 따라 Int32또는 Int64시스템에 따라 작동 합니다.


이것은 코드 조각이 아니므로 인쇄해야합니까? 아니면 REPL을 사용한다고 말하는 것이 그 제한을 극복합니까?
Lyndon White

1
그것은 판사에게 달려 있습니다. REPL 사용법은 흔하지는 않지만 Swift Playgrounds는 매우 인기가 있습니다 (특히 iPad에서). 개인적으로, 나는 그것이 공정한 게임이라고 생각합니다. 사람들은 사용자 정의 암시 적으로 값을 인쇄 골프를위한 프로그래밍 언어 디자인이 다르지 않다
알렉산더

4

루비, 10 바이트

p 0.size*8

Ruby는 길이에 상관없이 정수를 사용할 수 있지만 내부적으로 기계어에 맞는 값을로 저장합니다 Fixnum. 이 메소드는 Fixnum#size항상 길이를 기계어의 바이트 단위로 리턴합니다.

Fixnum클래스는 Ruby 2.4.0에서 제거되었으며 기능은 class에 포함되었습니다 Integer. 코드가 의미합니다.


4

쉘, 26 바이트

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

arch대신 사용할 수 있습니다 uname -m.
Dennis

1
@Dennis 반드시 그런 것은 아닙니다. macos : uname -m-> x86_64, 그러나 arch-> i386. macos :( 또한, 이것은 bash 특정입니다
-zsh

@StevenPenny zsh?glob / 단일 문자 와일드 카드로 해석하려고합니다 .
Doorknob

이것은 Windows에서 실행됩니까?
Ajasja

1
Cygwin과 @Ajasja
Steven Penny

4

배쉬, 25 17 바이트

getconf LONG_BIT

골프 도움말 데니스에게 감사합니다.


4

C, 22 바이트

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

이것은 기본 이진을 가정하는 포인터 크기 기반의 답변입니다. 이 0로 캐스팅 된 경우 int**(주소 0x0). 그런 다음 8을 0에 더합니다. C는 포인터를로 이동 sizeof(int*)*8합니다. 4 바이트 * 8 비트 = 32, 8 * 8 비트 바이트 = 64 정도로 우리 얻을 (int**)0x20하고 0x40이는 암시 적 암시 그들을 반환하여 정수로 캐스팅된다 int-returning 기능.

C, 독립형, 34 바이트

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

C, 유니 코드, 30 개 코드 포인트, 34 바이트 (UTF-8)

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

이것이 어떻게 작동하는지 이해하려고 노력했지만 단서가 없습니다. 설명을 추가 할 수 있습니까?
NieDzejkob

@jbcreix 영리한 ...
NieDzejkob

3

자바, 50 바이트

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


도서관인가요? 그렇다면 언급해야합니다! 그래도 Oracle의 JDK 8에서 사용할 수있는 클래스를 볼 수 없습니다 (저는 평소에 JDK 6 및 7을 사용하지 않습니다).
Olivier Grégoire

2
이 답변은 유효하지 않습니다. 인쇄되지 않습니다.
Philipp

6
Quoting Dennis :> 또한 일반적인 코드 골프 규칙이 적용되며 함수에서 복귀하는 것이 I / O 기본값의 일부라고 말합니다.
Asu

바이트 수를 ()->com.sun.jna.Native.POINTER_SIZE*8
줄이려면

3

PHP, 29 바이트

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

https://3v4l.org/Y6JXv


아 난이게 좋아. 어떻게 작동합니까?
tuskiomi 2016 년

4
php_uname('m')반환 x86_6464 비트 OS에 같은 그렇지 않으면 뭔가 i386. 4문자열의 6 번째 문자 (5 번째 색인)입니다 '4' - 4 == 0 == false. 그리고 @인용되지 않은 문자열 및 초기화되지 않은 오프셋에 대한 경고를 표시하지 않습니다.
Petah

2
이것은 OS가 아닌 PHP의 아키텍처를 감지합니다. 제가 64 비트 윈도우에서 32 비트 PHP를 실행하고있어, php_uname('m')반환합니다 'i586'.
Gras Double

@GrasDouble 잘 ymmv 것 같아요 Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah

1
@tuskiomi 8 비트 운영 체제가있는 경우 64로 인쇄됩니다
Bja

3

파이썬 3 , 77 84 71 59 바이트

@JonathanAllan 덕분에 -13 바이트!
@Clearer에 의해 아래로 59

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

온라인으로 사용해보십시오!

내 주먹 시간 코드 골프 :)
64 비트 OS에서 32 비트 파이썬을 실행할 때도 올바른 버전을 출력해야합니다.
가정 platform.machine()제공 i*86또는 x8632 비트에 대한-OS. 이를 확인할 수있는 제품이 없습니다. 0OS가 64/32 비트가 아닌 경우 출력입니다. 비트
편집 : 인쇄 명령문을 추가하여 7 바이트 더 길었습니다.


64 비트 시스템에서 32 비트 OS를 실행할 수 있기 때문에 (또는 foo8664 비트 : p 라는 일부 시스템을 가질 수 있기 때문에) 수용 가능한지 확실하지 않지만 수용 가능한 경우 9를 저장할 수 있습니다 (edit .. .13!) 바이트 print((a==64)*a+32*(a==86)).
Jonathan Allan

from platform import*;print({'4':64,'6':32}[machine()[-1]])작동합니다.
더 명확한

@Clearer 다음 제약 조건이 누락 될 수 있습니다. 중요 : 비어 있지 않은 영숫자 문자열을 32 비트 또는 64 비트가 아닌 다른 문자열로 인쇄하십시오. .
tOmAtE

@tOmAtE 32 비트 또는 64 비트가 아닌 경우 비어 있지 않은 문자열을 인쇄하는 예외가 발생합니다.
더 명확한

2
architecture ()를 시도하고 from platform import*;print(architecture()[0][:2])
받아쓰기를
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.