2

C言語のソースコードを見つけました。ここから取得します:リンク:

#include<stdio.h>
int main()
{
    int a,b,hasil;
    printf("Masukan integer pertama: ");
    scanf("%d",&a);
    printf("Masukan integer kedua: ");
    scanf("%d",&b);
    hasil = a - ~b -1;
    printf("Hasil tambah kedua-dua integer :%d",hasil);
    return 0;
}

コードは、2 つの整数を加算する操作を"+"使用していないようです。"- -"このテクニックやコンセプトは何に使われているのか、誰か教えてもらえますか?

4

5 に答える 5

6

この「技」は頭の体操です。実際の使用に関する限り、それはほとんど役に立ちません: 単項マイナスを使用せずb2 の補数で負を計算するだけです:

-b == (~b + 1)
a+b == a - (-b) == a - (~b + 1) == a - ~b - 1;
于 2013-06-07T16:44:52.427 に答える
3

足し算はここで引き算に置き換えられます: a + b = a - (-b). 現在のほとんどのプロセッサ (少なくとも私が認識している限り) では、負の整数は 2 の補数-b = ~b + 1(ビット単位の NOT とプラス 1) として表されます。したがって、a + b = a - (~b + 1) = a - ~b - 1.

于 2013-06-07T16:46:28.523 に答える
1

この行:

hasil = a - ~b -1;

魔法です。このコードは、符号付き整数が、最近普及している2 の補数表現を使用して表現されていることを前提としています。この表現の 1 つのプロパティは、符号なし (生のビット パターンとして、~演算子の処理方法) として解釈される場合、負の数は として表されます(1 << bitwidth) - n。ここnで、 は負の数の絶対値であり、bitwidthは のビット数ですint

これは基本的に、数値をビット単位で NOT すると にk変換される- k - 1という事実につながりa - (~b) - 1ますa - (-b - 1) - 1 = a + b

于 2013-06-07T16:47:30.903 に答える
0

プログラムは次のとおりです。

#include <stdio.h>

#include <conio.h>


unsigned int f (unsigned int a , unsigned int b);


unsigned int f (unsigned int a , unsigned int b)

{

   return a ?   f ( (a&b) << 1, a ^b) : b;

}


int main()

{


int a = 9;

int b = 7;


int c = f(a,b);

printf("Sum = %d", c);

getch();

return 0;


}

出力: 合計 = 16


于 2014-07-02T11:08:55.993 に答える
0

参照コードよりも少し洗練された、減算命令のみを実装するプロセッサを設計した人がいます。

コード

c = a - ~b - 1;

少し複雑すぎる言い方です

c = a - -b;

さらに、2 の補数演算が必要です。

于 2013-06-07T16:47:22.740 に答える