24

ビットが重複しないように定義された 4 つの 32 ビット数値があるとします。つまり、

unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;

各数字のどこに、FFs の代わりに何かを入れることができます。

加算ビットごと、またはそのような種類の数値に対して常に同じ出力が生成されると言っているのは正しいですか?

ありがとう!

4

6 に答える 6

38

2 つの数値 num1 と num2 が適用される限りnum1 & num2 == 0、次のようになります。

num1 + num2 == num1 | num2

この理由は、加算が基本的にビット単位の XORキャリー ビットであるためです。しかし、キャリー ビット ( ) がない限りnum1 & num2 == 0、加算はビットごとの XOR に要約されnum1 & num2 == 0ます。

于 2011-09-07T13:44:15.123 に答える
5

いいえ:

num3 + num3 => 0x000001FE

num3 | num3 => 0x000000FF

もちろん、同じビットが設定されていないことがわかっている場合にのみ追加することを保証する限り、安全です。

于 2011-09-07T13:44:06.903 に答える
4

はい、(ビット単位で見た場合)0+1は と同じ0|1です。唯一の違いは1|1 (=1)vs.1+1(=0b10)です。つまり、0 を作成し、オーバーフローが発生し、左側のビットに影響します)。

したがって、あなたの場合、どちらも同等です。ただし、安全な側に移動して、エラーが発生しにくい方を選択する必要があります。

于 2011-09-07T13:43:06.643 に答える
3

のようなことをしていない限りnum3 + num3、はい。

于 2011-09-07T13:43:50.553 に答える
2

ビット単位の加算で複数の 1 が追加されると (ソースに 1 があるか、別の場所からのキャリーも 1 であるため)、キャリーが生成され、1 つの場所が他の場所に影響を与えます。加算で加算される 1 が最大で 1 つある限り、物事はビットごとの OR と同じです。

これは、加算回路 (http://en.wikipedia.org/wiki/Adder_%28electronics%29) を見てもわかります。キャリーが生成されない場合、回路に参加するすべての要素は「または"要素。

于 2011-09-07T13:45:56.173 に答える
0

加算とビット単位またはビット単位と同じか、いずれかのビットが含まれます。ビットの相互に排他的な性質を考えると、通常の加算はまったく同じです。

于 2011-09-07T13:44:45.017 に答える