私は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関数は機能しません。
ありがとうございます!
この機能は、私が探していたものとほぼ同じです.ClojureのWebサイトのチートシートにはまだ登場していません。 – Joel
Fun fact - unchecked-intは長い値を返します。 – Joel
@ジョエルそれはfunyです。 Integerという単語はオファーされたものです。私たち(すべてのCS)int16、int32 ....とInteger型成長する必要があります。全体の数字は混乱しています。フロートの場合も同じです。 – nickik