2012-02-25 46 views
26

Scalaのこのビットで〜は何をしますか?例えばScalaのチルダ演算子

scala> val apple = 1 
apple: Int = 1 

scala> ~apple 
res0: Int = -2 

そのワームは、私のリンゴに何をしたのですか?

+2

scaleXと、Scalaのためhoogleのような:http://scalex.org/?q=~ –

+0

@GeneTリンクが、それはビット単位ではない作業者の確認のための – sjking

答えて

46

まず、いくつかのメタアドバイス。コンパイラが構文砂糖をどのように展開するか、型を推定するか、暗黙的な変換を適用するかについては、scala -Xprint:typer -e <expr>を使用して何が起こったかを知ることができます。

scala -Xprint:typer -e "val a = 2; ~a" 

... 
private[this] val a: Int = 2; 
private <stable> <accessor> def a: Int = $anon.this.a; 
$anon.this.a.unary_~ 

さて、接頭辞~unary_~の通常のメソッド呼び出しに展開されます。 language specificationから

6.12.1プレフィックスXオペレーション

プレフィックスX演算op eが識別さERSの+-!またはなければならないプレフィックスXオペレータOPから成り~。 式op eは、fi後メソッドのアプリケーション e.unary_opに相当します。

プリフィックス演算子は、 の通常の関数アプリケーションと異なり、そのオペランド式がアトミックである必要はありません。例えば、 の入力シーケンス-sin(x)-(sin(x))と読み取られ、関数 のアプリケーションネゲートsin(x)は、オペランドnegateおよび(x)のfi演算子sinの のアプリケーションとして解析されます。

(それは、この電力を夢中にするためには良い考えではありませんが!)接頭辞演算子がタイプに建てに限定されないことを意味し、彼らはあなた自身のタイプに使用することができます

scala> object foo { def unary_~ = "!!!" } 
defined module foo 

scala> ~foo 
res0: java.lang.String = !!! 

あなたの質問は何ですか? methods starting with uの標準ライブラリのScalaDocのインデックスをチェックアウトすることができます。 nightly ScalaDocには、最近このメソッドのドキュメントが追加されています。

the bitwise negation of this value 
Example: 
~5 == -6 
// in binary: ~00000101 == 
//    11111010 
+0

説明と参考に感謝します。 – Jack

16

は、整数に適用したときのビット単位の演算子ではありません。それはヘックスで見るのが一番簡単です:

scala> "%x".format(~0x7F) 
res0: String = ffffff80 
+2

+1を破られます。あなたが答えたときに私はバイナリ文字列を印刷していた。私は1つの答えしか受け入れることができないという謝罪。 – Jack

+2

"最も簡単"は主観的かもしれません... – FracturedRetina

関連する問題