ビッグエンディアンまたはリトルエンディアン


57

LリトルエンディアンアーキテクチャでB実行されるif またはビッグエンディアンアーキテクチャで実行されるif を出力するプログラムまたは関数を作成します。小文字の出力lまたはb許容されます。

入力はありません。

得点はコードゴルフであるため、バイト数が最も少ないコードが勝ちます。

編集: 以下のコメントに従って、エントリはどちらのアーキテクチャでも実行できる必要があることを明確にしています。

これが影響する答えは1つだけであり、その答えはこれが事実であることを明確に示していると思います。


1
ボックスのメモリ。私はあなたが何を意味するのか分かりません
リアム

7
これは興味深い挑戦だと思います(そして、それは普通の方法ではありません)が、それをテストするのは非常に難しいでしょう。特に、ほとんどのコードは非常にプラットフォーム固有であるためです。
DJMcMayhem

7
そうだと思いますが、それはエソランとゴルフの言語が「通常の」言語よりも苦労するものだからです。確認するのはそれほど難しくないと感じています。最悪の場合、手で検証できるはずです
リアム

2
特定のマシンコードに基づいた答えは禁止されていると思いますか?それ以外の場合B0 4C C3mov al, 'L' / retまたはunsigned char f(){ return 'L'; }が有効なx86回答になります。
マーガレットブルーム

5
ブラボー!汎用プログラミング言語が競争力のあるコードゴルフチャレンジの場合。
ペルメル

回答:


42

Python、33バイト

import sys
exit(sys.byteorder[0])

sys.byteorderいずれかである'little''big'(そして、コードを見ずにこの文を読みますあなたの人々のために、[0]最初の文字を取ることを意味します)。


課題は、出力は単語全体ではなく、LおよびB(または小文字のバリアント)でなければならないことを示しています。
user2428118

43
それがsys.byteorder[0]、つまりの最初の文字を言う理由ですbyteorder
s3lph

36

C、26バイト

a=66<<24|76;f(){puts(&a);}

32ビットintおよびASCII文字を想定しています。amd64(リトルエンディアン)およびmips(ビッグエンディアン)でテスト済み。

GCC、23バイト

00000000: 613d 2742 0000 4c27 3b66 2829 7b70 7574  a='B..L';f(){put
00000010: 7328 2661 293b 7d                        s(&a);}

feersumによって提案されました。複数文字定数の値は実装に依存しますが、これはGCCで機能するようです。同じアーキテクチャでテスト済み。


7
短いのはa='B\0\0L';\0sをヌルバイトで置き換えることができます。
feersum

1
@feersum複数文字定数のエンディアンは、実装に依存するようです。私は通常、コードゴルフではそれほど心配しませんが、この課題はすべて実装を区別することです。
アンデルスカセオルグ16

現在、このコードはGCC以外で動作しますか?
feersum

1
@feersum C89は両方を許可します。
アンデルスカセオルグ16

1
AIX 5.2を実行しているRS6000でxlc(VisualAge C ++ Professional / C for AIXコンパイラ、バージョン6)を使用すると、26バイトのプログラムが正常に「B」を出力します
Jerry Jeremiah

24

MATLAB /オクターブ、24バイト

[~,~,e]=computer;disp(e)

このcomputer関数は、実行されているコンピューターに関する情報を提供します。3番目の出力はエンディアンネスです。LまたはB、それぞれリトルエンディアンまたはビッグエンディアン用です。

Ideoneで試してみてください


1
何。これはstackoverflowにとっては問題ありません、私はこれを知りませんでした!
ブレインガイダー

20

JavaScript ES6、50バイト

_=>"BL"[new Int8Array(Int16Array.of(1).buffer)[0]]

TypedArrayオブジェクトがインタープリターのネイティブエンディアンを公開するのが良い考えだと誰が決めたのかわかりませんが、ここにあります。


5
WebGLの人々は、GPUに渡すときにエンディアンを変換する必要がないようにすることをお勧めします。他のほとんどの人はバカだと思っていた…:(
gsnedders

11

C、36 35バイト

@algmyrと@owacoderのおかげで1バイト。

main(a){printf(*(char*)&a?"L":"B");}
main(a){putchar(66+10**(char*)&a);}
main(a){putchar("BL"[*(char*)&a]);}

クレジットはこちら

ビッグエンディアンのマシンがないので、テストされていません。


2
C仕様では、1引数のmain関数を使用できますか?
CodesInChaos

@codesinchaosはい、できます。指定されたコマンドライン引数の数になります。通常ここでは1、入力が与えられないために変数を初期化するために使用されます(また、プログラム名は常に最初の引数としてカウントされます)
Liam

2
@Liam:0または2以外が許可されている場合、C11で定義された実装です。

1
またはmain(a){putchar("BL"[*(char*)&a]);}
-owacoder

2
呼び出し規約を台無しにすると、31:になりmain(char a){putchar("BL"[a]);}ます。
アンドレア

8

Mathematica、22

{B,L}[[$ByteOrdering]]

これはおそらく、組み込み関数を使用しないことに関するいくつかの規則を破りますが、私は代替案をゴールドベルグ化することにあまり興味がありません。


1
ビルトイン(ほとんどの答えはあまりにもそれらを使用している)細かいです
リアム・

2
また、Mathematicaには組み込みの機能があります!
gcampbell

3
これはスニペットであり、プログラムや関数ではないので、関数にするには追加&する必要があります。(ただし、「プログラム」を構成するものに関して意見の相違がある場合があります。)
Anders Kaseorg

1
@Anders私はPCGの現在の標準(実際に知っていたとしても)にあまり精通していませんが、インタープリター言語の私見の1つの利点は、スニペットプログラムであることです。これはMathematicaの他のプログラムと同じようにスタンドアロンで実行できます。
Mr.Wizard

1
@ Mr.Wizard Mathematicaの「プログラム」はスタンドアロンスクリプト(明示的な印刷が必要)を指しますが、この答えはREPLを使用します。
LegionMammal978

8

C、27

1バイト長くなりましたが、とにかくここにあります:

f(){putchar(htons(19522));}

うまくいきました。説明してください。
ABcDexter

3
@ABcDexter 19522のバイナリ展開は1001100 01000010(バイトを区切るスペース)です。これで、各バイトを取得し、ベース10に変換してASCIIテーブルをチェックすると、このバイトシーケンスがに等しいことがわかりますLBhtonsにそのことを行う、とputcharだけLSBを出力します。ビッグエンディアンシステムでは、Bリトルエンディアンでhtonsは、バイトが反転するため、LSBはになりLます。
クロルタン

交換する19522'LB'、コンパイラの警告と-1バイトのために。
スタン・ストラム

8

PowerPCマシンコード-20バイト

PowerPCはバイエンディアンです(エンディアンは起動時に設定できます)。したがって、このコードはBEマシンとLEマシンの両方で実行できるというチャレンジリクエストに準拠する必要があります。これは、1返す関数、または現在設定されているエンディアンに依存します 'L''B'

AFAICTは、関数として、SVR4 PowerPC ABI(ppc32上のLinuxで使用)、PowerOpen ABI(AIXなどで使用)、OS X ABIに準拠しています。特に、GPR 0は揮発性のスクラッチレジスタであり、GPR 3は「小さな」値を返すために使用されるという事実にのみ依存しています。

00000000 <get_endian>:
   0:   7c 00 00 a6     mfmsr   r0
   4:   54 03 0f fe     rlwinm  r3,r0,1,31,31
   8:   1c 63 00 0a     mulli   r3,r3,10
   c:   38 63 00 42     addi    r3,r3,66
  10:   4e 80 00 20     blr

これで、次のようになります。

  • MSRは、 GPレジスタ0に読み込まれます。MSRのビット31には、エンディアンネス設定が含まれています(0 =ビッグエンディアン、1 =リトルエンディアン)。
  • rlwinmちょうどそのビット抽出:それはGPR0、の値をとるR otates リットル(現在位置0にあるように)1つの場所によってEFT及びmは 1(それら31,31によって生成されたマスクを用いてそれを要求2)。結果はGPレジスタ3に入れられます。
  • 10和66によって結果を乗算('B')(10との間の差である'L''B'
  • 最後に、呼び出し元に戻ります

ノート

  1. はい、質問は印刷するように求めていますが、異なるオペレーティングシステムで変更せずに実行されると予想されるアセンブリ内の内容をどのように印刷するべきかは明確ではありません。=)
  2. 興味のある方は、rlwinmのドキュメントをご覧ください。PowerPCについてほとんど何も知らないので、この種の指示は非常に興味深いものでした。

    2018年の更新:Raymond ChenがPowerPCアーキテクチャに関するシリーズを公開しています。ここに彼の素晴らしい投稿rlwinmと友人があります。


7

Java 8、96、64 52バイト

()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);

このSO答えに基づいたゴルフ。すべてのクレジットは@LeakyNunと@AlanTuningに送られます。Javaは、ゆるやかに続き続けています。

96バイト:

 char e(){return java.nio.ByteOrder.nativeOrder().equals(java.nio.ByteOrder.BIG_ENDIAN)?'b':'l';}

64バイト:

char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}

未テストb / cビッグエンディアンのマシンにアクセスできません。


1
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
リーキー修道女

char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
リーキー修道女

@LeakyNun Java APIにビットが表示されません。実行すると、「java.nioでビットが公開されていません」
ブルー

ああ、大丈夫。
リーキー修道女

ラムダを使用する場合は52バイト!()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
ショーンワイルド

6

Perl、38 36バイト

say+(pack"L",1 eq pack"V",1)?"L":"B"

システムのデフォルトのバイト順で数値をパックし、それをリトルエンディアンのバイト順でパックされた数値と比較することにより機能します。


6

(G)Forth、24バイト

here $4200004C , c@ emit

セルは32ビットであると仮定します(ForthインタープリターはGforthのベースプレフィックスをサポートします)。単にメモリに数値0x4200004Cを格納し、ローエンドでバイトを表示します。


5

C、34バイト

これは、ASCII文字エンコードを想定しています

main(a){putchar(66+10**(char*)a);}

引数なしで呼び出します。

説明:

コールでは、a1になります。すること*(char*)aの最初のバイトアクセスaリトルエンディアンのプラットフォームでビッグエンディアンのプラットフォーム上で、1になり、0になります。

したがって、ビッグエンディアンプラットフォームでは、このコードは66 + 10 * 0 = 66をに渡しputcharます。66はのASCIIコードですB。リトルエンディアンプラットフォームでは、66 + 10 * 1 = 76を渡しますL。これはのASCIIコードです。


5

C#、60 52バイト

これでC#は驚くほど競争力があります。

char e=>System.BitConverter.IsLittleEndian?'L':'B';

C#6構文に対するGrooの功績。

60バイト:

char e(){return System.BitConverter.IsLittleEndian?'L':'B';}

C#6構文を使用すると、少し短くすることができます。char e=>System.BitConverter.IsLittleEndian?'L':'B';もちろん、これ(およびJavaの回答)は実際には値を出力しません。
-Groo

プログラミングパズルとコードゴルフへようこそ!これはいい最初の答えです。
アレックスA.

5

ジュリア、24 19バイト

()->ntoh(5)>>55+'B'

これは入力を受け取らず、を返す匿名関数ですChar。呼び出すには、変数に割り当てます。整数は64ビットであると想定しています。

このntoh関数は、渡された値のエンディアンを、ネットワークバイトオーダー(ビッグエンディアン)からホストコンピューターで使用されるものに変換します。ビッグエンディアンマシンでntohは、変換は行われないため、恒等関数です。リトルエンディアンのマシンでは、バイトが交換されますntoh(5) == 360287970189639680。これは、おそらく読みやすく、0000010100000000000000000000000000000000000000000000000000000000バイナリに相当します。

結果を右にntoh(5)55 ビットシフトすると、ビッグエンディアンマシンでは0、リトルエンディアンマシンでは10になります。文字定数にすることを追加し'B'、我々が得るでしょう'B''L'、それぞれ、ビッグまたはリトルエンディアンのマシンのために。

FryAmTheEggmanとDennisのおかげで5バイト節約されました!


32ビットの場合、55から23に変更する必要があります(16ビットの5のうち5も7でなければなりませんでした)。デニスは次のようなものを意味すると思います:()->ntoh(5)>>55+'B'
-FryAmTheEggman

1
f()='L'-ntoh(10)%16そしてf()='L'-ntoh(10)&10、すべてのプラットフォーム上で動作するはずです。
デニス


5

Common Lisp、27バイト

SBCLおよびECLでテスト済み。ポータブルなアプローチの場合、trivial-featuresを使用する必要があります

(lambda()'L #+big-endian'B)

#+表記は、リードタイムの条件読み出し条件式が真と評価された場合にのみ、次のフォームを。ここでの条件は、キーワードがリスト(プラットフォーム固有の情報を含むリスト)に属する#+big-endian場合にテストが満たされることを意味するテキスト全体です。次の式はで、テストの結果に応じて読み取られるかスキップされます。プラットフォームがビッグエンディアンであり、REPLで上記のフォームを記述する場合、次のように記述したのとまったく同じです。:big-endian*FEATURES*'B

CL-USER>(lambda()'L 'B)

(NB。CL-USER>はプロンプトです)

関数の本体は暗黙的PROGNで、最後の式の評価のみが返されることを意味します。したがって、上記のは、実際にシンボルを返しますB。ただし、読み取り時の条件がfalseと評価された場合、フォームは次のように読み取ります。

CL-USER>(lambda()'L)

...これは単にsymbolを返しますL


スニペットは許可されていません。代わりに、完全なプログラムまたは機能を作成してください。
エリックアウトゴルファー

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ更新、ありがとう
コアダンプ

注:スニペットは、OPによって明示的に許可されている場合にのみ許可されます。
エリックアウトゴルファー

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀこれについてのリファレンスを提供できますか?ここおよび/またはシェルスニペットに他のREPL回答があり、このメタ投稿は、REPL回答がデフォルトでOKであることを示唆しています。ありがとう。
コアダンプ

5

ARMv6以降:20バイトのマシンコード

0xE10F1000 : MRS   r0,CPSR        ; read current status register
0xE3110C02 : TST   r0,#1<<9       ; set Z flag if bit 9 set
0x03A0004C : MOVEQ r0,#'L'        ; return 'L' if Z clear
0x13A00042 : MOVNE r0,#'B'        ; return 'B' if Z set
0xEBxxxxxx : BL    putchar        ; print it (relative branch)

テストすることはできません。適切なマシンが手元にないためです。CPSRのビット9は、現在のロード/ストアのエンディアンを示します。


あなたは(関数からの戻りを使用することができBX lr、それはありますか?)の代わりにputcharするので、r0返された結果のための適切なレジスタです。
アナトリグ

実際、それ(実際にはMOV pc、lr)は以前の編集の1つに含まれていました。ただし、これは、レターを返すだけでなく、レターを印刷する仕様を満たします。
user1908704

私はリファレンスを間違って読んでいるかもしれませんが、これは「thumb 2」命令エンコーディングで実行できると思います。これは、最初の命令が32ビットのままであることを意味します(ARM v8リファレンスマニュアルのF7-2720の「T1のエンコード」。これにより、0xF3EF_8000になります)。2番目も32ビットです(オペランドのエンコードは少し奇妙ですが、「i:imm3」を0010に、「imm8」を00000010に設定すると、全体の命令が0xF010_2F02になります)。第3の命令の前に、我々は0x204Cと...となって次の二つのMOV命令、上の条件を制御するために、「ITE EQ」(0xBF0C)を挿入する必要がある
ジュール・

... 0x2042(全体で2バイトを節約)。そして、最後のBL命令は表現するのが少し難しいです。なぜなら、私たちが知らないアドレスのビットは、私たちが知っている命令のビットの中に散らばってしまうからです。合計18バイト(F3 EF 80 00 F0 10 2F 02 BF 0C 20 4C 20 42 F??? ?? ??)ARMv7(?)で動作する可能性はありますが、これによりアーキテクチャがARMv8以降に変更されると考えています。
ジュール

4

Perl 5、21 + 1 = 22バイト

で実行しperl -Eます。

say ord pack(S,1)?L:B

amd64(リトルエンディアン)およびmips(ビッグエンディアン)でテスト済み。


ある-Eフラグは、バイト数で本当に必要?Perl 5.10を使用していると言うことsayができます(このバージョンでコマンドが使用可能になっているため)
Paul Picard

1
@PaulPicardしかしuse 5.10.0;、さらに多くのバイトがあります!
アンデルスカセオルグ16

1
@PaulPicardあなたの主張は間違っています。Perl 5.10では、-Eスイッチまたはuseステートメントが必要ですsay
アンデルスカセオルグ16

3
-EPPCGでは「無料」です。何も追加する必要はありません。
ベン

1
(ただし-n、そうで-pはありません)
Ven

4

R、28 23バイト

substr(.Platform$endian,1,1)

.Platform$endianbigビッグエンディアンで実行し、リトルエンディアンで実行した場合に戻りますlittle。ここでは、を使用してsubstr、出力の最初の文字を返すため、bまたはのいずれかlです。

に含まれるendianオブジェクトで始まる唯一のオブジェクトであるように、次の23バイトのコードとの部分一致によりe、オブジェクト.Platformを減らすことができます。

substr(.Platform$e,1,1)

3

Clojure、46 44バイト

#(nth(str(java.nio.ByteOrder/nativeOrder))0)

これは、Javaビルトインを使用してマシンのエンディアンを取得する関数です。次に、"LITTLE_ENDIAN"またはのいずれかの文字列表現を取得し、"BIG_ENDIAN"選択された文字列の最初の文字を取得して返します。

@ cliffrootのおかげで2バイト節約されました


clojureとは実際には何ですか、それはlispまたはjavaですか?
リーキー修道女

@LeakyNun Javaで動作する実用的なLISPでしょうか?言うのが難しい。
マイル

#(nth(str(java.nio.ByteOrder/nativeOrder))0)2バイト短い
クリフルート

3

ルビー、 3130文字。

puts [1].pack("s")>"\01"??L:?B

うーん、より良い方法でなければなりません。他のソリューションでは印刷を省略していると思うので、charを出力する必要がない場合は5文字少なくしてください。つまり、何も印刷したくない場合は、「puts」部分を削除します。


私の記憶が正しければ、Ruby 1.9の後には、使用することができます?L?Bの代わりに、 puts :Lputs "B"
Sherlock9

puts [76,66].pack("s")[0]うまくいくと思います。
ウェインコンラッド

@ Sherlock9、ありがとう、1文字少ない。@WayneConrad、おそらくあなたの答えを追加します、テストするビッグエンディアンのマシンは手元にありませんが、リトルエンディアンでは動作します。ただし、次のように変更しても機能しませんputs [76,66].pack("s>")[0]。つまり、私がよく理解していない何らかの理由でビッグエンディアンに取り組んでいない可能性があります。しかし、これは機能しているようです(ソリューションから派生)puts [19522].pack("s>")[0]。WDYT?ビッグエンディアンで評価する場所を見つけることができるのだろうか。
アコスタディノフ

残念ながら、テストするビッグエンディアンのマシンもありません。
ウェインコンラッド

3

Bash(および他のUNIXシェル)、32(33)バイト

1回目と2回目の試行:

case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L         # non-portable

デニスのおかげで、短いバージョン:

od<<<a|grep -q 5&&echo L||echo B  # non-portable
echo|od|grep -q 5&&echo B||echo L # portable

echoユーティリティ16進値と、改行を出力し0A、かつない他の出力。以下のために<<<aそれがあります61 0A

odユーティリティは、バイトの数が奇数の場合、デフォルトでは、ゼロパディング2バイト語として入力を解釈し、進に変換します。これにより、エコーの出力はとして解釈0A 00され005000、ビッグエンディアンまたはリトルエンディアンに変換され000012ます。61 0Aとなり005141リトルエンディアンにし、060412ビッグエンディアンで。ODのフル出力はまた、我々が使用することはできません意味のアドレスとサイズのデータを含む01または2テストのために。

このコマンドは、システムのエンディアンを公開するように明確に定義されています。標準から:

数値を解釈するときに使用されるバイト順序は実装で定義されますが、対応するタイプの定数がシステムのメモリに格納される順序に対応しなければなりません。

互換性に関する注意

echo|od二重引用符なしでバッククォートを入れるかどうか(結果として3ワードの引数になるcase)がすべてのシステムでサポートされているかどうかはわかりません。すべてのシステムが終了改行なしでシェルスクリプトをサポートするかどうかはわかりません。ビッグエンディアンシステムにパディングバイトを追加した場合のodの動作は100%ではありませんが、ほぼ確実です。必要に応じecho aて、ポータブルバージョンに使用できます。すべてのスクリプトはbash、ksh、およびzshで動作し、ポータブルなスクリプトはdashで動作します。


変更は必要ありません。それが動作するシェルを言語ヘッダーに配置するだけで、設定は完了です。
デニス

1
@Dennis私は分析のようなものをやって好き...私はあればそれはもっと楽しいのに行う他よりもbashやzshの短い答えを取得し、何か非標準を見つけます。たぶん私は何ができるかを見るでしょう[[
-Random832

1
分析に問題はありません。最後の段落は、シェル固有の回答が有効かどうか不確かなように聞こえました... od<<<a|grep -q 5&&echo L||echo BBashなどで機能するはずです。
デニス

ビッグエンディアンVMでテストし、期待どおりにecho|od印刷0000000\n005000\n0000001します。
デニス

@ user17752エンディアンがの出力に影響しないためod -a
Random832

3

PHP、16バイト

<?=pack(S,14)^B;

これは、既存の2つのPHP回答で使用されていない2つのトリックを使用します。

  1. pack()またはunpack()に渡される値は、0または1だけでなく、何でもかまいません。
  2. ビット単位のXOR演算子(^)は文字列に対して機能し、結果は短い文字列と同じ長さであるため、文字列のインデックス付けや三項演算子の必要性が回避されます。

2

ノード、42バイト

n=>require('os').endianness()[0]

プロ:組み込み機能があります。欠点:プロパティ名が非常に長い


2

PowerShell、44バイト

[char](66+10*[BitConverter]::IsLittleEndian)

文字66はでB、10文字後は番号76、...ですL。「true」のブール値は1、数値にキャストされたときになります。BitConverter標準の.NETクラスです。


1

ラケット、35 28バイト

(if(system-big-endian?)'B'L)

'Bまたは'Lそれぞれ。これが十分具体的でない場合はお知らせください:)



1

Haskell(GHCのみのサイズ制限数値型を使用)、75バイト

import Unsafe.Coerce
import GHC.Int
f="BL"!!fromEnum(unsafeCoerce 1::Int8)

(ビッグエンディアンのアーキテクチャではテストされていませんが、動作するはずです!)


1

K、15バイト

    ("bl")@*6h$-8!`
    ,"l"

説明;

    From right to left;
    -8!`       /serialises the back tick and returns (0x010000000a000000f500)
    6h$-8!`    /This casts the result to `int which is type 6h(could have used `int$-8!`) - the result is (1 0 0 0 10 0 0 0 245 0i)
    *6h$-8!`   /* means first, we take the first item which is 1. Since it will be either 1 or 0, we can use it to index (@) into the two element list on the left i.e. ("bl")1 returns "l" and ("bl")0 returns b

1

Bash、27バイト

iconv -tucs2<<<䉌|head -c1

U + 424C)は、3つのUTF-8バイトとしてエンコードされますE4 89 8C

iconvglibcの関数を使用し、UTF-8ロケールが使用されると想定されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.