0

現在、ビットセットのすべての算術演算を処理するユーティリティを開発しています。ビットセットは任意の数に合わせて自動サイズ変更できるため、非常に大きなビットセットで加算 / 減算 / 除算 / 乗算およびモジュロを実行できます (700Mo ムービーを内部にロードして、プリミティブ整数として扱うようになりました)。

私は1つの問題に直面しています.追加後に必要なビット数に合わせてビットセットのサイズを変更する必要があります.両方の数値が処理しているビット数だけを知って、すべてを保存します (その表現が正か負かは問題ではありません)

私の質問が十分に明確でない場合、問題を指摘するためにあなたと共有できるコード全体があります。

前もって感謝します。jav974

4

2 に答える 2

2

しかし、すべてを格納するために必要なビット数を正確に知るための絶対的な法則を思いつくことはできませんでした。両方の数値が処理しているビット数だけを知っていました (その表現が正か負かは問題ではありません)。

また、「両方の数値が処理しているビット数のみ」を指定する方法はありません。

同じ符号の数値の場合、追加のビットが 1 つ必要になる場合があります。小さい数値の最上位ビットから開始して、キャリーの影響を吸収する 0 をスキャンできます。例えば:

1010111011101 +
..10111010101
..^ start here

ここでは両方の数値が 1 であるため、0 にヒットするまで (結果が大きい方の入力と同じ桁数になる)、または大きい方の数値の最上位ビットに到達するまで左にスキャンする必要があります。結果にもう 1 桁ある場合)。

1001111011101 +
..10111010101
..^ start here

長い方の入力の開始位置が 0 であるこの場合、最初に右移動スキャンを実行して、上記の左移動スキャンを開始する前に、その開始位置の右からキャリーがあるかどうかを確認する必要があります。 .

符号が異なる場合:

  • 1 つの値が他の値より 2 桁以上少ない場合、結果に必要な桁数は、大きい方の入力の桁数と同じか、1 桁少なくなります。
  • そうしないと、結果に必要な桁数を計算するためだけに、加算のためにさらに多くの作業を行う必要があります。

これは、符号ビットが絶対値ビットのカウントとは別のものであると仮定しています。

于 2013-05-29T08:31:31.410 に答える
0

最後に、加算後の代表ビット数は、最大で、最も多く所有するもののビット数 + 1 です。

unsigned char を使用した説明は次のとおりです。

最大 unsigned char の場合:

   11111111 (255)
+  11111111 (255)
= 111111110 (510)

当然、max + max = (max + 1 のビット) の場合、x と y が 0 と max の間の場合、結果のビットは max + 1 (非常に最大) になります。

これは、符号付き整数でも同じように機能します。

于 2013-05-29T11:41:37.750 に答える