2012-02-29 4 views
0

私はテッサラル算術を使っていくつかの作業をしています。単語の特定の領域でキャリーを検出する必要があります。プログラムの性質上、ビットの位置は入力に依存します。たとえば、32ビットのワードサイズで、6ビットの入力では、加算キャリーのビット19と3、減算のビット31と15をチェックすることに興味があります(より一般的には、興味深いビットは(ワードサイズ - 1)、(ワードサイズ/ 2 +入力ビット/ 2)、(ワードサイズ/ 2-1)および(入力ビット/ 2))。カスタムオーバーフロー検出

(after addition)   ((NumberToCheck & (1 << 19 + 1 << 3)) != 0) --> carried bit(s) 

    (or after subtraction) ((NumberToCheck & (1 << 31 + 1 << 15)) != 0) --> carried bit(s) 

はこれにより良いアプローチがあります:

の線に沿って何か私は何を考えているのですか?

答えて

1

a,bの合計キャリーインとその合計sは、carry-ins = a XOR b XOR sと計算されます。

もちろん、キャリーインは直前のビット位置からのキャリーアウトでもあります。 (符号なしオーバーフローを示す)

最も重要なキャリーアウトが0xFF...FFが適切な最大値であり、abが負の値であるC/C++話す、most-significant-carry-out = (a > 0xFF...FF - b)、で、で決定することができます。

減算を加算に減らすことができます。 this questionthis questionへの私の答えを見てください。

+0

私はこのアプローチが私の必要とすることをするかどうかはわかりません。私がtesseral算術を使って作業しているとき、私は最初に私が取り組んでいる言葉のビットを解き放つものです。次に、私は一度に2つの場所での貨物をチェックする必要があります。 1つはx座標用、もう1つはy座標用です。上記の例では、00000xxx00000xxxb(各xは意味のある値であり、それぞれ0はない)のようなものを持っているので、最大数を割り当てることは左のサブワードを助けるだけです。 – bendicott

+0

助けがあれば、私は正の空間だけにも興味があるので、aとbは常に正の値になります。各サブワードは1つだけインクリメントまたはデクリメントされます。これにより、さらに単純化されます。キャリーが発生した場合、どこでキャリーが発生するかがわかります。私は主にスピードに興味があります。これらの特定のビットへの変更を確認する良い方法はありますか? (ダブルポストに申し訳ありませんが、1つのコメントには収まりません) – bendicott