1

私はそれが結合的で可換であることを知っています:

あれは、

(~x1 + ~x2) + ~x3 = ~x1 + (~x2 + ~x3) 

~x1 + ~x2 = ~x2 + ~x1

ただし、私が試したケースでは、分配的ではないようです。つまり、

~x1 + ~x2 != ~(x1 + x2)

これは本当ですか?証拠はありますか?

次のようなCコードがあります。

int n1 = 5;
int n2 = 3;
result = ~n1 + ~n2 == ~(n1 + n2);

int calc = ~n1;  
int calc0 = ~n2;  
int calc1 = ~n1 + ~n2;  
int calc2 = ~(n1 + n2);

printf("(Part B: n1 is %d, n2 is %d\n", n1, n2);
printf("Part B: (calc is: %d and calc0 is: %d\n", calc, calc0); 
printf("Part B: (calc1 is: %d and calc2 is: %d\n", calc1, calc2);
printf("Part B: (~%d + ~%d) == ~(%d + %d) evaluates to %d\n", n1, n2, n1, n2, result); 

次の出力が得られます。

Part B: (n1 is 5, n2 is 3
Part B: (calc is: -6 and calc0 is: -4
Part B: (calc1 is: -10 and calc2 is: -9
Part B: (~5 + ~3) == ~(5 + 3) evaluates to 0
4

4 に答える 4

0

1の補数は、固定幅レジスタの負の数と正の数を表すために使用されます。追加で配布するには、以下を適用する必要があります:~a + ~b= ~(a + b)。OP状態+は、「2つの2進数」の加算を表します。これ自体はあいまいですが、符号なし2進数を追加することを意味するとすると、いいえ、褒め言葉は分配的ではありません。

1の補数には2つのゼロがあることに注意してください。すべてのビットが1であるか、すべてのビットがゼロです。

~0 + ~0 != ~(0 + 0)~0がゼロであることを確認してください。ただし、~0すべてのもので表されます。それ自体に追加すると、左シフトと同じように2倍になり、右側の桁にゼロが導入されます。しかし、それはもはや2つのゼロのうちの1つではありません。

ただし、0はゼロであり、0 + 0またゼロであるため、もゼロです~(0 + 0)。しかし、左側はゼロではないので、分布は成り立たない。

一方...2つの褒め言葉を考えてみましょう。すべてのビットを反転して1つ追加します。自分の褒め言葉のネガを特別に扱うように注意を払うと、そのバージョンの「2進加算」は、2の褒め言葉に似ており、2の褒め言葉と同じように、おなじみの商環になってしまうため、分配的です。

前述のウィキペディアの記事には、予想される算術動作を可能にするための加算の処理に関する詳細があります。

于 2012-06-18T17:39:01.003 に答える
0

1の補数に関するウィキペディアの記事をご覧ください。1 の補数での加算には、最下位ビットにオーバーフロー ビットを追加する必要があるエンド キャリー アラウンドがあります。

~(NOT) は 1 の補数で (NEGATE) と同等であるため、-次のように書き直すことができます。

-x1 + -x2 = -(x1 + x2)

どちらが正しい。

于 2012-06-18T02:13:09.347 に答える
-1

・モルガンの法則より:

 ~(x1 + x2) = ~x1 * ~x2
于 2012-06-18T01:29:38.303 に答える