OSは32ビットですか、64ビットですか?


53

もう重要ではありませんが、時には誰かが知る必要があります。

ここに簡単なゴルフがあります。ユーザーの入力なしで、コードが実行されているコンピューターが64ビットオペレーティングシステムであるか、32ビットオペレーティングシステムであるかを教えてください。

コードが32ビットオペレーティングシステムで実行されている場合は「32」を出力し、コードが64ビットオペレーティングシステムで実行されている場合は「64」を出力します。重要: 32ビットでも64ビットでもない場合、他の空でない英数字の文字列を印刷します。

64ビットオペレーティングシステムを搭載したコンピューターで実行されている32ビットプログラムは、「64」を出力する必要があります。ユーザーは可能な限り64ビットソフトウェアを使用すると想定できます。

エントリーの資格を得るには、コードがWindows 4.10以降の MicrosoftがサポートするWindowsシステム、および選択した少なくとも1つのLinuxフレーバー(そのフレーバーが無償である限り)で実行できる必要があります。プログラムが正しい値を返す限り、互換性modをインストールできます。

通常の規則が適用されます。

注:あなたの答えが32または64だけを印刷することを意図しており、altケースではない場合、私はそれを受け入れますが、競合する答えではありません。

これらのコードを異なるOSで実行した結果を後で投稿してみます!


5
したがって、「64ビットオペレーティングシステムを搭載したコンピューターで実行されている32ビットプログラムは「64」を出力することに注意してください。ユーザーは可能な限り64ビットソフトウェアを使用すると想定できます。」インタプリタ/コンパイラなどが32ビットと64ビットの両方で利用可能な場合、32ビットOSは常にインタプリタ/ etcの32ビットバージョンを実行し、64ビットOSは常に64ビットインタプリタを実行します/等。だから32または64中の番組との間の差を気にし、OSが32または64であり、基本的にのみのみ32ビットの実装と言語のための問題。右?
リンドンホワイト

2
ここでの多くのソリューションは、プログラムのコンパイルに32ビットコンパイラーが使用された場合、64ビットOSで「32」を出力します。これでよろしいですか?
マーティンローゼナウ

15
「Windows 4.10」とは何ですか?それはWindows 98を意味しますか?それともWindows NT 4を意味しますか?それよりも「新しい」と思うものは何ですか?これは非常によく考え抜かれた課題のようです。
コーディグレー

13
そこには「公式の窓の仕様は」ではない、と誰もが「Windowsの4.10」であるとして、Windows 98を指していません。あなたは文字通り最初です。そのため、バージョン番号を使用してかっこいいまたは公式に聞こえるのではなく、実際の製品名を使用する必要があります。ところで、Windows 9xは64ビットビルドでは使用できなかったので、実際にはWindows 98でのみ実行され、「32」を返すだけのエントリを送信するのは正当ですか?非常に不公平/スポーツ的でない/面白くないようですが、技術的にはあなたのルールで許可されます。
コーディグレー

3
Windowsバージョンに関する質問にはまだ回答していません。DOESはWindowsの4.10以降で実行することができなければなりません平均のWindows 4.10と、すべての新しいバージョンにまたは任意の単一のWindowsバージョン、4.10以降に
デニス

回答:


44

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で値を印刷する方法さえあるのかどうかはわかりません。

説明

このコードは、2つのtellを使用して、実行中のアーキテクチャを決定します。最初の命令は16ビットと32ビットの命令0x48です。これはdec %eaxですが、64ビットでは命令サイズのプレフィックスです。2番目の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。そして、あなたがすでに私が考えていた答えを投稿しているのを見ます、それがこの問題のためではなかったなら。:-)あなたは私の賛成票を持っています。
コーディグレー

バイトは16ビットモードで48表さdec %eaxれますか?
phuclv

48

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

この関数は、Linuxでi386 SysV ABIに従ってELF32で使用される場合、およびstdcall呼び出し規則に従ってPE32で使用される場合にWindows / Wineで動作します。


実際には、別のアプローチに従うと、バイトカウントをさらに削減できます。
ルスラン

これは理論的に非32/64ビット環境で何をしますか?
-tuskiomi

1
@tuskiomiいずれの場合でも、このコードは32または64のいずれかを返します。16ビットモードでこのバイトシーケンスを解釈する唯一の違いは、ニーモニックをからeaxに変更することaxです。したがって、セレクターがのcs場合0x23、結果は64になり、そうでない場合は32になります
Ruslan

ただし、これは2つの特定のオペレーティングシステムに固有のように見えます。cs = 0x23の32ビットシステムを簡単に作成できます。代わりに、CPUを対象とする8バイトの回答を参照してください。
ピーターフェリー

@peterferrieええ、それが私が別の答えを持っている理由です。しかし、あなたのものはそれを2バイトだけアウトゴルフします。
ルスラン

32

Mathematica、17バイト

$SystemWordLength

13
もちろん、ビルトインがあります!\ s(+1)
tuskiomi

&これをREPLに追加するか、指定するべきではありませんか?
LegionMammal978

5
@ LegionMammal978 "コードが32ビットオペレーティングシステムで実行されている場合、" 32 "を出力し、64ビットオペレーティングシステムで実行されている場合、" 64 "を出力します。どちらでもない場合」「実行時にこれを行う関数を提供する」ではありません。「これを行う」だけです。
パトリックスティーブンス

17
@PatrickStevens:質問が提出に必要な形式を指定しない場合、それはプログラムまたは関数であり、デフォルトではスニペットではありません

3
@ ais523 Mathematicaではプログラム、関数、スニペットの間に違いはないと主張します。すべては単なる表現です。
-ngenisis

21

ブートローダー

GRUBとIPXEの両方に、実行時にアクセス可能なチューリング完全プログラミング言語があることをご存知ですか?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バイト

これには3つのファイルが必要です。最初のファイルは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
そのため、アーキテクチャに基づいてOSを変更します。箱の外側を考える。好き。
tuskiomi

バイトカウントは何ですか?
Restioson

1
私はあなたが使用している場合、それはより読みやすいだろうと信じて@hildred ## iPXE, 36 bytesの代わりに### ipxe 36
NieDzejkobを

21

ジュリア14 13バイト

n->8sizeof(1)

説明する:

  • nothing整数関数32または64を返す(を含む)何でもとるAnon関数
  • 整数リテラルは、Int32ビットか64ビットかによって、an Int32またはanのいずれかのタイプですInt641任意の数字が可能です)
  • 関数呼び出しの前に数値を配置して並置乗算を行います
  • これは基本的に、rahnema1の答えで使用されるのコードのSys.WORD_SIZE縮小版です

他の楽しい答えはですが()->"$(Int)"[4:5]、その件数をカウントダウンすることはできません。


-1 @RomanGräfに感謝


:あなたは、仮引数使用することができcodegolf.meta.stackexchange.com/a/12696/56341
ローマグラーフ

19

ジュリア、20 17 16バイト

n->Sys.WORD_SIZE

* @ LyndonWhiteに感謝3バイトを保存* @RomanGräfに感謝1バイトを保存

以前の回答:

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

オンラインでお試しください!


1
私は個人的に、このようなものです!
-tuskiomi

2
次の規則に従ってください:codegolf.meta.stackexchange.com/q/2419/62131を行うことで3バイトを削ることができます()->Sys.WORD_SIZE
リンドンホワイト

1
:あなたはまた、仮引数使用することができcodegolf.meta.stackexchange.com/a/12696/56341
ローマグラーフ

14

JavaScript(Node.js)、24バイト

_=>process.arch.slice(1)

これは、関数し、戻る'32''64'またはどちらかの'rm'


1、私は64ビットのアーチがが32ビットOSを実行していることができたと
タコ

1
32ビットWindowsで「32」が表示されるため、動作しているように見えます。
ケンYN

5
あなたはREPLを使用している場合は、7つのバイトをオフに剃ることができますosの代わりに、processos.arch().slice(1)
GilZ

これは、実際のOSアーキテクチャではなく、プロセスに報告されたOSアーキテクチャを返します。したがって、これはLinuxでは機能しません。(お気に入りの検索エンジンに「setarch」をパンチします。)
デビッドシュワルツ

@DavidSchwartz私は誤解してる場合を除き、それは私のLinuxボックス上の罰金を動作しますが、PPCGに、我々はアーチを変更するユーザの観点から変更されていない環境を想定することができます
Downgoat

13

C、33 31 29 23バイト

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

ゴルフのコツについてのコメント者@ceilingcatと@Dennisに感謝します!


13
また、通常のゴルフ規則が適用され、関数から戻ることはI / Oのデフォルトの一部であると述べています。
デニス

11
それは、32ビットプログラムとしてコンパイルするか64ビットプログラムとしてコンパイルするかによって異なりますか?
ケンYN

4
これは要件に準拠していません。" 64ビットオペレーティングシステムを搭載したコンピューターで実行されている32ビットプログラムは" 64 "を出力することに注意してください。 "これは、OSでなくプログラムのコンパイル方法を示します。
デビッドシュワルツ

2
@DavidSchwartz「ユーザーは可能な限り64ビットソフトウェアを使用すると想定できます。」
クラスリンドベック

2
と言って申し訳ありませんが、sizeofはコンパイル時に評価されます。したがって、32ビットexeをコンパイルして64ビットマシンで実行すると、32が出力され、64が出力されるはずです(stackoverflow.com/questions/2615203/…)。いいアイデアだ!
ディナイズ

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で実行するのは、せいぜい難しいと確信しています。すべてのOSの98でテストすることを期待するのも不合理です-最近のVMにインストールするのも簡単ではありません(私を試してみました。KVMで実行するつもりはなく、VBoxディスプレイアダプターとの興味深い相互作用があります) 。(64ビットという概念もありません...それは本当にばかげた要件です。)
ボブ

1
@ ub3rst4r私はここで解釈されたプログラミング言語のすべてがWindows 4.10で動作する実装を持っていることを疑います!
マーティンローゼナウ

1
これは、64ビットOS上の32ビットPowerShellの場合、失敗したように見えます。
クリスJ

@ChrisJ少なくともWin10およびWin2012 R2では、x86 PowerShellから適切な結果が返されます。Linuxではテストしていません。
ブーガルー

10

パイソン2、52、48、42の 41バイト

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

完全に人間に感謝します!


ズーム!1分以内にラインを越えます。
-tuskiomi

私は家に帰るまでこれをテストするのを控えるつもりですが、これが「32」と「64」を印刷するかどうかはわかりませんが、他の場合は自信があります。
-tuskiomi

@tuskiomi、これは「32ビット」または「64ビット」を印刷します
ダニエル

1
from struct import*;print calcsize("P")*8短いです。
完全に人間

12
64ビットOSの32ビットPythonでこれを実行する場合、これはあなたにあると思います。ほとんどの他の回答も...とにかくそれに敏感なようだ
ニック・T

10

Java 8、45バイト

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

@Dopapp彼が意味するのは、これがスニペットであって、プログラムや関数ではないということです。Java 8では、これは機能するはずです。n=>System.getProperty("os.arch")
NoOneIsHere

@NoOneIsHere、私の頭をはるかに超えてくれてありがとう
ダニエル

2
「コードが32ビットオペレーティングシステムで実行されている場合、「32」を出力し、コードが64ビットオペレーティングシステムで実行されている場合、「64」を出力します。どちらでもない。」。これは、すべてでは...という行いません
オリヴィエ・グレゴワール

4
Windows 98(v4.10)用のJava 8を入手できますか?
TessellatingHeckler

4
@TessellatingHeckler Java 8には「i586」が必要です(それが何であれ)。エントリは言う:「あなたのコードは、Windowsの4.10上で実行することができなければならないか、」あなたのコードは、Windowsの4.10上で実行することができなければならない、新しい「新しいです」。新しい Windowsで実行します。
オリビエグレゴワール


8

Windows CMD、56 52バイト(ボブに感謝!)

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

それでも驚くほど長い-今までで最長!


1
実は、%windir%\SysWOW64私が思うに、さらに短いです
ボブ・

7
Windows 4.10以降、および選択した少なくとも1つのLinuxフレーバーで実行できる必要があります」-これに適したLinuxフレーバーはどれですか。
TessellatingHeckler

1
Wineをインストールすると@TessellatingHeckler ...?
ケンYN

1
速記の使用はどうですか?if EXIST "c:\Progra~3" (echo 64)else echo 32デフォルトでは、あなたが持っているProgramDataProgram Filesその3分の1が存在する場合、我々は64でなければなりません
マリー

3
これは8ビットOSでは何を印刷しますか?
-tuskiomi

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を使用しています

次の2つのケースでは、バイナリが32ビットの実行可能ファイルになるという知識が必要です。そして、この出力パラメータの出力パラメータの説明IsWow64Process

プロセスがWOW64で実行されている場合にTRUEに設定される値へのポインター。プロセスが32ビットWindowsで実行されている場合、値はFALSEに設定されます。プロセスが64ビットWindowsで実行されている64ビットアプリケーションの場合、値もFALSEに設定されます。

これにより、さらに2つのケースが発生します。

  • IsWow64Process 存在し、TRUEを返します->私たちは64ビットマシン上にあります
  • IsWow64Process 存在し、FALSEを生成する-> 32ビットマシン上にいる

64ビットWindows上の64ビットアプリケーションがFALSEを生成する部分について心配する必要はありません。アプリケーションが32ビットであることがわかっているので

ああ、この課題でカバーされていない、とにかくまれであるはずの追加のケースが1つあります。

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

区別する必要があるのは2つのケースだけです

  • IsWow64Process kernel32.dllに存在しない=> 32ビットマシン上にあります。

  • IsWow64Process 存在する=> 64ビットマシン上にあります。

によって提供される実際の値IsWow64Processは、このチャレンジとは無関係です。なぜなら、バイナリをどんな場合でも32ビットにしたいからです。

ほとんどの答えとは異なり、これは実行されるマシン上でコンパイルされるバイナリ自体に依存しません。

32ビットマシンではなく64ビットマシンにのみ存在する短い関数を知っていれば、答えを短くすることができました。


2
.dllモジュール名文字列からドロップします。これはゴルフに適しているだけでなく、実際に通常の使用でもより良い練習です。また、ゴルフの目的で、後にスペースをドロップできます#include
コーディグレー

おかげで、私は実際には64ビットで見つけることができるが32ビットでは見つけられないモジュールを探して全体を減らしたかったのです。私はまだ見ています。悲しいことに(この目的のために)WoW64と呼ばれるモジュールはありません。
MrPaulch

実際にwow64.dllとがありますがWow64Win.dll、私はGetModuleHandleそれらと一緒に電話しようとしませんでした。ただし、問題は、64ビットマシンで実行されている64ビットプロセスではなく、64 ビットマシンで実行されている32ビットプロセスに対してのみロードされることです。
コーディグレー

私は持っています。64ビットマシン上でも0を返します。実際に理にかなっています。それらは直接リンクされるために存在しません。システムは、実行時にリダイレクトを処理します。
MrPaulch

ああ、しかし問題。SDKドキュメントから:「現在のバージョンの32ビットWindowsのKernel32.dllにもこの機能が含まれているため、オペレーティングシステムが64ビットバージョンのWindowsであるかどうかを検出する信頼できる方法ではありません。」
コーディグレー

7

C#、60 50バイト

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

ありがとう@TheLethalCoder


1
サイトへようこそ!:)
DJMcMayhem

4
あなたは「行」を削除した場合の保存4バイト
ジョン

1
「環境」を削除することもできます。および「コンソール」。using static System.Environment;andの使用を想定してusing static System.Console;
ジョン

1
また、変更WriteLineWrite
トーマスアヨブ

7
私がチェック@ジョン最後の時間は、輸入が含まれていなければならないので、バイト・カウントに追加します
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ビットを出力します。ルールを逃します。
ダークダスト

1
@DarkDust You can assume that users will use 64 bit software whenever possible.したがって、64ビットユーザーは64ビットRubyを実行していると想定されます。
バリューインク

6

R、16バイト

.Machine[[18]]*8

ポインターのサイズを返します。


1
すべてのポインターサイズソリューションと同様に、プログラムが64ビットOS上で実行される32ビットバイナリの場合、これは間違った結果を出力します。
ダークダスト

1
@DarkDust Rは解釈され、可能な場合はユーザーが64ビットのソフトウェアを使用し、64ビットのインタープリターも使用すると想定できます。IMHO、ルールは、コンパイル言語に適用
NieDzejkob

@NieDzejkobそれは、誰かが私の答えに応じて同じタイプのコメントを入れたときにPHPで私の答えに使用したものとまったく同じロジックです。ユーザーが64可能な場合は、インタープリタ言語でビットソフトウェア。
-Bja

6

Perl、18 15 18バイト

say length pack p8

私が取得する64␤ので、私の32ビットコンピュータ上でperl64ビットのIVで構築されました。これは通常、32ビットバージョンのWindowsで実行している場合に該当します。
ブラッドギルバートb2gills

@ BradGilbertb2gillsコードを以前のバージョンに戻しました。この場合でもこれは動作するはずです。それでも機能しない場合はお知らせください。回答を削除します。
グリムミー

1
それは正しく機能します。
ブラッドギルバートb2gills

HP 9000/785では間違っているようです。32を与えます。しかし、32ビットHP / PA-RISC CPUがあったとは思いません。
オレ丹下

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ビットの実行可能ファイルとしてコンパイルされた場合、64 in eaxを返します。32ビットとしてコンパイルされた場合、OSに関係なく32を返します。

この回答は、次のルールに基づいています。

ユーザーは可能な限り64ビットソフトウェアを使用すると想定できます。


これは興味深いアプローチですが、実際に実行できるようにプログラムに書き込むにはどうすればよいですか?独自のローダー関数を作成する以外のバイナリコードの実行について考えることができるすべての方法は、64ビットまたは32ビットコードに固有のファイルを使用します。そのため、あなたは...実際に実行するために、このコードの2つのコピーが必要になります
ジュール・

@Julesインラインアセンブリとして、こちらのように高級言語プログラムに入れることができます。次に、デフォルトのオプションでプラットフォーム固有のコンパイラを使用するだけで、ビットネスが得られます。
ルスラン

@ l4m2どうして私に怒鳴るの?とにかく、あなたは正しい、これらの2バイトは私の実験から残ったジャンクのようです。削除します。
ルスラン

5

PHP、18バイト

<?=PHP_INT_SIZE*8;

これは、PHP_INT_SIZEが正しい場合、32、64、およびその他のビットCPUのすべてのケースを正しく処理します。PHPが実行されているCPUに関係なく、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ビットバイナリの場合、これは間違った結果を出力します。
ダークダスト

1
これを「AnyCPU」用にコンパイルし、「32ビットを優先」チェックボックスをオフにして指定する必要があります。
コーディグレー

4

パワーシェル、 17 52バイト

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

次のいずれかに該当する場合、64を返します。

  • 現在のドライブには、ファイル名が末尾の丸括弧で終わるディレクトリがありますProgram Files (x86)
  • arch例えばに対して4、(ASCII 52)で終わる文字列を返します。x86_64i686

try-catchは、あなたがあれば取得エラー回避を意図しているGCI何も返さないと、あなたが持っていないアーチ。私は今のところそれを行うためのより短い方法を見つけていません。Linuxではlsが目に見えるエラーを生成するため、gcils上で使用されます。

このバージョンは、OSが単なるPowerShellではなく64ビットであるかどうかを検出する必要があり、WindowsおよびLinuxで動作するようにテストされています。マックのサポートについては、交換してくださいarchuname -m

以前のWindowsのみのバージョン: -!(ls \*`))*32+64


これはどのLinuxディストリビューションで実行されますか?
tuskiomi

@tuskiomiああ、私の悪い-あなたが何を意味するかわかります。課題を適切に読みませんでした。答えを削除する必要がありますか?
アンディC.

WINEで動作することがわかっている場合は、そのままにしておく必要があります。
tuskiomi

@tuskiomi少なくともUbuntu 14.04、16.04、RHEL7、CentOS7、およびSUSEのいくつかのバージョン:github.com/PowerShell/PowerShell/releases
Xudonax

4

Swift 4 REPL / Playground、12バイト

Int.bitWidth

Intワードサイズで、システムのように、Int32またはInt64システムに応じて機能します。


これはコードスニペットではないので、印刷する必要がありますか?または、REPLを使用していると言っても、その制限を回避できますか?
リンドンホワイト

1
それは審査員次第です。REPLの使用はあまり一般的ではありませんが、Swift Playgroundsは非常に人気があります(特にiPadで)。個人的には、公正なゲームだと思います。人々は暗黙的に価値を印刷するゴルフ用のカスタムプログラミング言語を設計しますが、これも
Alexander

4

ルビー、10バイト

p 0.size*8

Rubyは任意の長さの整数を使用できますが、内部的には、マシンワードに適合する値をとして保存しますFixnum。このメソッドは、Fixnum#size常にマシンワードのバイト単位の長さを返します。

FixnumクラスはRubyの2.4.0で除去し、その機能は、クラスに含まれていましたInteger。コードが立っています。


4

シェル、26バイト

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

arch代わりに使用できますuname -m
デニス

1
@Dennis必ずしもそうではありません。macosの場合:uname -m-> x86_64ですが、arch-> i386。macos :(また、これはbash固有です
-zshで

@StevenPenny zsh?、グロブ/単一文字のワイルドカードとして解釈しようとします。
ドアノブ

これはWindowsで実行されますか?
アジャシャ

1
Cygwinの@Ajasja
スティーブンペニー


4

C、22バイト

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

これは、ネイティブバイナリを想定したポインターサイズベースの回答です。0キャストされint**(アドレス0x0)。次に、8を0に追加します。これは、Cで進み、ポインタをで進めますsizeof(int*)*8。4バイト* 8ビット= 32、8バイト* 8ビット= 64我々が得るので(int**)0x200x40その後、暗黙的に暗黙的にからそれらを返すことによって、整数としてキャストされている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

Java、50バイト

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


それは図書館ですか?はいの場合は、言及する必要があります!ただし、OracleのJDK 8にはそのクラスがありません(通常のJDK 6と7は自由に使えません)。
オリビエグレゴワール

2
この答えは無効です。印刷されません。
フィリップ

6
デニスの引用:>また、通常のゴルフの規則が適用され、関数から戻ることはI / Oのデフォルトの一部です。
明日

少ないバイト数のランバ関数に変更します()->com.sun.jna.Native.POINTER_SIZE*8
。– Ferrybig

3

PHP、29バイト

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

https://3v4l.org/Y6JXv


ああ 私はこれが好きです。どのように機能しますか?
tuskiomi

4
php_uname('m')x86_6464ビットOSで返されますi3864文字列の6番目の文字(インデックス付けされた5番目の0)である'4' - 4 == 0 == false。また@、引用符で囲まれていない文字列や初期化されていないオフセットに対する警告を抑制します。
ペタ

2
これにより、OSではなくPHPのアーキテクチャが検出されます。64ビットWindows上で32ビットPHPを実行していphp_uname('m')ます'i586'
グラダブル

@GrasDoubleよくymmvを推測しWindows NT USER-PC 10.0 build 15063 (Windows 10) AMD64ます。
ペタ

1
@tuskiomiは、8ビットのオペレーティングシステムがある場合、64を出力します
-Bja

3

Pythonの377の 84 71 59バイト

-13バイト、@ JonathanAllanに感謝!
@Clearerで59まで

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

オンラインでお試しください!

私の最初の時間のコードゴルフ:)
64ビットOSで32ビットPythonを実行している場合でも、正しいバージョンを出力する必要があります。
仮定platform.machine()できますi*86またはx8632ビット-OS用。これを確認できるものはありません。出力は0、OSが64 / 32Bit
Editにない場合です:printステートメントを追加したため、7バイト長くなりました


64ビットマシンで32ビットOSを実行できる(またはfoo8664ビット:p というa というマシンを使用できる)ため、許容できるかどうかはわかりませんが、許容できる場合は9を保存できます(編集.. .13!)バイトのprint((a==64)*a+32*(a==86))
ジョナサンアラン

from platform import*;print({'4':64,'6':32}[machine()[-1]])うまくいくでしょう。
鮮明

@Clearerこれは次の制約を見逃します
トムテ

@tOmAtE 32ビットでも64ビットでもない場合は、例外をスローし、空でない文字列を出力します。
クリア

2
architecture()を試して、dictを保存しfrom platform import*;print(architecture()[0][:2])ます
。-
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.