2011-12-22 10 views
4

私はClojureで画像処理ライブラリを作成しようとしていますが、テストを書く際に問題が発生しました。Clojureの符号なしの比較?

画像データは、符号付き(Java、拡張Clojure、符号なし整数を持たない)の2次元配列として格納されます。私は与えられた座標のペアでピクセルを取得する関数を持っています。

(is (= (get-pixel image 0 (dec width)) 0xFFFF0000)) 

(0、幅-1)の画素が赤であるかどうかを確認、次のとおりです。その関数の私のテストは、次のようになります。問題は、get-pixelが符号付きintを返しますが、Clojureは0xFFFF0000をlongとして扱うことです。この場合、getピクセルは-65536(16進数では0xFFFF0000)を返し、Clojureは4294901760と等しいかどうかをチェックしています。

ここではいくつかのオプションがあります。私は小数点(-65536)として16進数の符号付き整数の解釈を使用してテストを書き直すことができましたが、テストの意図があまり明確ではないと思います。私は、負の数を正のlongに変換する関数を書くことができますが、それは複雑さの追加層です。最も単純な方法はおそらくちょうどちょうど2つの数字の間でビットを行い、それが変更されているかどうかを確認することですが、まだそれはもっと複雑に見えます。

0xFFFF0000をlongではなく符号付き整数として評価したり、任意の2つの数値をビット単位で比較したりするビルトイン方法はありますか?数値が大きすぎて符号付きintとして表現できないため、int関数は機能しません。

ありがとうございます!

答えて

4

clojure 1.3には、unchecked-intという機能があります下の4バイトとそれらをint型になります:

user> (unchecked-int 0xffff0000) 
-65536 

それはClojureのは、あなたがさまざまなサイズのリテラル数値を入力することはできませんので少し悲しいです - ここでは、Java (int)0xffff0000Lと同等のものをやっています。

+0

この機能は、私が探していたものとほぼ同じです.ClojureのWebサイトのチートシートにはまだ登場していません。 – Joel

+0

Fun fact - unchecked-intは長い値を返します。 – Joel

+2

@ジョエルそれはfunyです。 Integerという単語はオファーされたものです。私たち(すべてのCS)int16、int32 ....とInteger型成長する必要があります。全体の数字は混乱しています。フロートの場合も同じです。 – nickik

0

どのようなclojureのバージョンを使用していますか?プリミティブ処理は、バージョン1.3ではかなり変更されました。私は少し実験をしましたが、私はあなたが記述したものとは異なる結果を得ているようです。

user=> (int 0xFFFF0000) 
IllegalArgumentException Value out of range for int: 4294901760 clojure.lang.RT.intCast (RT.java:1093) 
user=> (long 0xFFFF0000) 
4294901760 
user=> *clojure-version* 
{:major 1, :minor 3, :incremental 0, :qualifier nil} 

1.3を使用している場合は、long機能を使用できます。また、ByteBufferでデータを操作し、バイトを直接処理することもできますが、Cで制御するレベルは決して得られません。

+0

いいえ、それは私が見ているものとほぼ同じです。私は画像データをintではなくlongとして保存しようとしましたが、int配列を返すbufferedImageクラスからgetColors()を使用してデータを取得しています。配列の各要素をlong型にキャストしても、いくらか負の値が残っています。 – Joel

関連する問題