浮動小数点XOR


15

あなたの仕事はとても簡単です。2つの浮動小数点を与え、それらのビットごとのxorまたはバイナリ表現を与え、それを浮動小数点として出力します。

例えば、

Normal: 16.7472 ^ 123.61 = 7.13402e-37
Binary: 01000001100001011111101001000100 ^ 01000010111101110011100001010010 = 00000011011100101100001000010110

Normal: 2.2 ^ 4.4 = 1.17549e-38
Binary: 01000000000011001100110011001101 ^ 01000000100011001100110011001101 = 00000000100000000000000000000000

Normal: 7.898 ^ 3.4444 = 1.47705e-38
Binary: 01000000111111001011110001101010 ^ 01000000010111000110101001111111 = 00000000101000001101011000010101

制限/説明:

  • 入出力は、任意の便利な方法で指定できます。
  • このプログラムは、完全なプログラムでも機能だけでもかまいません。どちらでも構いません。
  • float型には任意のサイズを指定できますが、最小サイズは2バイトです。
  • 標準的な抜け穴は禁止されています。
  • 最短のコードが優先されます。

2
ブールリストは便利な方法としてカウントされますか?
アダム

23
フロートの「バイナリ表現」は非常にあいまいです。使用する表現を定義する必要があります。すでにこの地球上の生命が使用した有限番号を含む表現の無限の数が、ありますが、そのようないくつかのIEEE 754のように他のものよりも人気であること
逆にエンジニア

7
この質問は、「xor the representations」ではなく「xor the values」としてより興味深いものになります。後者は、もちろん、同一のタイプのシステムを欠いているまたはタイプpunningを認める任意の言語で「XOR 2つの32ビット整数」のであり、したがって、かなり退屈...である
ICE手助け.. GitHubのSTOP R

5
入力または出力として、無限大、非正規、または負の0を処理する必要がありますか?
グリムミー

3
@Mark:いいえ、書かれているように、質問は、それらの表現が何であれ、それらの表現のxor'ingについてです。結果は浮動小数点形式に依存しますが、アルゴリズムは常に表現に対する単一のxor命令であり、かなり退屈です。
R .. GitHub停止ヘルプICE

回答:


53

x86-64マシンコード、4バイト

0f 57 c1 c3

組み立て中:

xorps xmm0, xmm1
ret

これは、2つのfloatまたはdoubleを引数(xmm0およびxmm1)として受け取り、floatまたはdouble(in xmm0)を返す呼び出し可能な関数です。

これは、Windows x64 x86-64 SysV ABI の両方の呼び出し規約に一致し、浮動小数点数と倍精度数の両方で機能します。(それらはXMMレジスターの下位4または8バイトで渡されます/返されます)。


12

C ++(gcc)74 32バイト

#define f(x,y)*(int*)x^=*(int*)y

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

私は以前にC ++でゴルフをしたことがないので、コードのサイズを半分にしたすべての人に感謝しています!引数として2つの浮動小数点数へのポインターを取り、結果を返すように最初の浮動小数点数を変更したマクロ。

2バイトを保存してくれた@ 12Me1と4を保存してくれた@Arnauldに感謝します!さらに14人、@ Neilがさらに6人、@ AZTECCOと@Nishiokaがさらに11人節約してくれた@Nishiokaに感謝します!5バイトを節約してくれた@PeterCordesに感謝します!


1
改行を削除して2文字を保存できます。これは、C
12Me21

1
でさらに4バイト節約できますz=*(int*)x^*(int*)y;
アーナルド

1
gcc拡張を使用すると、54バイト:#define f(x,y)({int z=*(int*)x^*(int*)y;*(float*)&z;})
西岡

2
ポインターを使用しているので、入力の1つを出力として使用することは合法ですか?もしそうなら、あなたは書くことができます(*(int*)x^=*(int*)y)
ニール

1
@Neilの提案を考慮すると、48バイトになります#define f(x,y)({*(int*)x^=*(int*)y;*(float*)x;})
西岡

9

ARM Thumbマシンコード、6 4バイト

48 40 70 47

組み立て中:

EORS R0、R1; 最初の2つのパラメータの排他的論理和、結果をリターンレジスタに格納
BX LR; リンクレジスタに格納されている値への分岐(リターンアドレス)

標準のArm呼び出し規約では、最初の2つのパラメーターはレジスターR0およびR1で渡され、結果はR0で返され、LRは戻りアドレスを保持します。32ビットのフロートでソフトフロートABIを使用していると仮定すると、これは4バイトで目的の操作を実行します。

-2バイト、Cody Grayのおかげ


2
EORS r0, r12バイトを節約するために、代わりに使用することは可能でしょうか?これは48 40、4バイトと比較して、2バイトの命令()にすぎませんEOR。あなたはすでにThumbをターゲットにしているので、私が見る限りこれはうまくいくはずです。唯一の違いはステータスフラグを更新することですが、この場合の副作用は気にしません。
コーディグレー

2
これは、VFP / NEON s0およびでなく整数レジスタでFP引数を渡すソフトフロートABIを使用していることを指定する必要がありますs1
ピーター

6

Python 3 + numpy、75 59バイト

lambda x,y:(x.view("i")^y.view("i")).view("f")
import numpy

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

2つのnumpy float32配列を引数として受け取り、numpy float32配列を返すラムダを定義します。

14バイトを節約してくれた@ShadowRangerと、Joelがさらに2バイトをありがとう!

インポートをドロップできる場合(私のラムダ自体が基本のnumpy関数ではなくnumpyオブジェクトのメソッドを呼び出すため)、さらに13バイトを節約できます。これについては、ゴルフの標準的な規則のコードからはわかりません。


JellyとRubyの回答よりも短いです。いいね!
エリックドゥミニル

あなたは(ちょうど呼び出し側が渡したと仮定し、完全に輸入を除去することによって、27バイト(48バイトにそれを落とす)をオフに剃ることができnumpy.float32ますが、そのメソッドを使用することができますので、S)との両方の交換int32と用途'i'float32して使用状況を'f'dtypeパラメータは、実際に変換される文字列にすることができdtype、あなたのために、そして便利に、'i'そして'f'それらのdtypesを作るための法的な方法があり、輸入への機能の必要性を除去するnumpyすべての名前空間にもの。インポートを削除するのにコードゴルフが合法かどうかはnumpy
わかり


輸入品を含める必要があると思いましたが、よくわかりません。dtypeのヒントをありがとう!
ニックケネディ

@NickKennedy:ええ、インポートが必要な場合は、8バイト(各int32to から2、4 'i'fromからfloat32まで'f')しか保存しませんが、それでも何かです。インポートが厳密に必要な場合は、名前を抽出import numpyするために使用せずに、パッケージの存在をアサートするように変更できますfrom numpy import*。これにより、合計で61バイトまで、さらに6バイトが得られます。
ShadowRanger

6

ゼリー + numpy、89 77バイト

“(F(“I^F(“IvF).item()”;"F“¢lẒṾ:/²)Ɓɱ¡vẠ⁷5Rʠ¡7ɼṆṪ{ė4¶Gẉn`¡Ð}ṫȥṄo{b»Ḳ¤¹ṣḢ}jʋƒŒV

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

主にnumpyオブジェクトとの間で変換を行う必要があること、およびnumpyがJellyによってロードされないため、__import__()組み込みを使用する必要があることから、Python 3コードよりも長いという疑わしい名誉があります。

引数として2つのフロートをリストとして受け取り、フロートを返すモナドリンク。

次のPython 3コードを評価します。

(__import__('numpy').float32(x).view("i")^__import__('numpy').float32(y).view("i")).view(__import__('numpy').float32).item()

ここで、xおよびy入力で置換されています。


5

APL(Dyalog Unicode)、14 バイトSBCS

完全なプログラム。stdinからの2つのIEEE 754 64ビット浮動小数点数(binary64)の1列の行列のプロンプト。そのような番号を1つ標準出力に出力します。

645DR≠⌿11DR

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

 プロンプト(非浮動に折りたたまれた数値は、関数を使用して強制的に浮動にできます⊃⊢⎕DR⍨645,⍨⎕DR

11⎕DR 1ビットのバイナリ(1)D ata R表現に変換(2行、64列の行列)

≠⌿ 垂直XOR削減

645⎕DR 64ビットfloatに変換(5)D ata R表現(単一の数値)


4

VAX BASIC(後のVMS BASIC、次にCompaq Basic)、11バイト

H = F XOR G

私には少しばかげているように見えますが、明らかに、古い言語は、強い型付けの問題をそれほど心配していなかったので、より良くなります。


1
このサイトへようこそ、最初の答えは素晴らしいです!私は余分なヘッダのように見えるものを編集してきましたが、編集すること自由に感じていない場合には、バック、任意の付随情報と一緒に
coinheringaahing caird

3

オクターブ、59バイト

@(a,b)(t=@typecast)(bitxor(t(a,u='int32'),t(b,u)),'single')

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

Typecastは、基礎となるビットを変更せずにキャストするMATLAB / Octaveの方法です。bitxor整数でのみ機能するため、これが必要です。をAssumedType3番目の引数として明示的に指定できる場合でも、なぜ浮動小数点数を実装しないのかわかりませんbitxor。レクリエーションプログラミングだけが使用されると思います。


FPビットパターンのビット単位は、アセンブリ言語で符号ビットを使用したり、exp()実装の一部として指数フィールドに整数を詰め込むことはほとんどありません。しかし、Octaveにはすでにコピーサインと否定のための関数/演算子があると思います。また、AND(定数マスク)を使用してからXORを使用して、ある値の符号を別の値の符号に基づいて条件付きで反転させるなど、マイクロ最適化については気にしません。asmの実際の最適化プロジェクト(実際にはAVX組み込み関数を使用したC)では、フロートのXORを使用し、符号ビットを調べてゼロに対するcmpを回避しました。
ピーター




2

C、23バイト

f(int*x,int*y){*x^=*y;}

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

これは少しずるいかもしれません。floats へのポインターをints へのポインターとして受け取ります。

ただし、動作します(結局Cです)。

これは、変数へのポインターを取得し、その場で変更することにより、許容可能な入力を利用します。(使用可能な)値は返されません。


2

JavaScript(Node.js) 105  101バイト

@Neilが推奨する短いノードバージョン@ShieruAsakotoの
おかげでさらに4バイトを節約

入力をとして受け取ります(x)(y)

x=>y=>(v=Buffer(4),v.writeInt32LE((g=n=>v.writeFloatLE(n)&&v.readInt32LE())(x)^g(y)),v.readFloatLE())

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


JavaScript(ES6)、115バイト

入力を2つのfloatの配列として受け取ります。

a=>(v=new DataView(new ArrayBuffer(4))).getFloat32(v.setUint32([x,y]=a.map(n=>v.getUint32(v.setFloat32(0,n))),x^y))

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


FYIノードBufferは数バイトを節約します:a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE())
ニール

@ニールありがとう!(の代わりに関数を使用して、さらに2バイトを節約しましたmap
アーナルド

1
削除newではnew Buffer(4)また、IIRC動作するはずです
Shieru Asakoto




1

Java(JDK)109 76バイト

(a,b)->Float.intBitsToFloat(Float.floatToIntBits(a)^Float.floatToIntBits(b))

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

Javaでゴルフをしてからしばらくして、バイトカウントの一部としてLHSの宣言が必要かどうかわかりませんか?DoubleBinaryOperatorを使用した場合、LHSは短くなりますが、RHSはDouble.doubleToLongBitsとDouble.longBitsToDoubleを使用する必要があるため、実際には長くなります。

バイト数を大幅に節約してくれたNeilに感謝します!


1
IIRCでは、バイトカウントの一部としての割り当てさえ必要とせず、Try it onlineに含めることができるテストスイートの一部としてのみです!ヘッダ。
ニール

@ニールありがとうございます!それは大きな違いになります!
デビッドコンラッド

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