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)

これに対するより良いアプローチはありますか?

4

1 に答える 1

1

整数 からのすべてのキャリーインと、 を計算することによってそれらの合計を見つけることaができbます。scarry-ins = a XOR b XOR s

当然、キャリーインは直前のビット位置からのキャリーアウトでもあります。

最も重要なキャリーアウト (符号なしオーバーフローを示す) は、C/C++ で言えば、 で決定できますmost-significant-carry-out = (a > 0xFF...FF - b)。ここ0xFF...FFで、 は適切な最大値であり、aおよびbは負でない値です。

引き算は足し算に還元できます。この質問この質問に対する私の回答を参照してください。

于 2012-03-01T22:33:53.317 に答える