2018-01-15 A+B 不用加號實現(xiàn)整數(shù)相加

直接上代碼

#include <stdio.h>

int add_one(int a, int b) {
    return a - (-b);
}

int add_two(int a, int b) {
    char *p = (char *) a;
    int c = (int) &p[b];
    return c;
}

int add_three(int a, int b) {
    if (0 == b)
        return a;
    int cxor = a ^b;
    int cand = a & b;
    return add_three(cxor, cand << 1);
}

int add_four(int a, int b) {

    int cxor = 0;
    int cand = 0;
    while (b != 0) {
        cxor = a ^ b;
        cand = (a & b) << 1;
        a = cxor;
        b = cand;
    }
    return cxor;
}
int main() {
    printf("#########ONE#########\n");
    int c = add_one(-20, -20);
    printf("c = %d\n", c);

    printf("#########TWO#########\n");
    c = add_two(-30, -20);
    printf("c = %d\n", c);

    printf("#########THREE#########\n");
    c = add_three(-40, 90);
    printf("c = %d\n", c);

    printf("#########FOUR#########\n");
    c = add_four(40, -50);
    printf("c = %d\n", c);

    return 0;
}

輸出:
#########ONE#########
c = -40
#########TWO#########
c = -50
#########THREE#########
c = 50
#########FOUR#########
c = -10

add_one

int add_one(int a, int b) {
    return a - (-b);
}

不解釋.......小聰明

add_two

int add_two(int a, int b) {
    char *p = (char *) a;
    int c = (int) &p[b];
    return c;
}

使用p[b] 獲取char數(shù)組 b個字節(jié)的偏移量.

int main() {

    char a[10] = {'1','2','3','4','5'};
    char *p = a;

    printf("p = %p\n",p);
    printf("a = %p\n",&a);

    printf("a[2] = %c\n",a[2]);
    printf("p+2= %c\n",*(p+2));

    printf("a[2]的地址: ,%p\n",&a[2]);
    printf("p + 2 的地址: %p\n",p+2);
}

輸出:
p = 0x7fff5ade795e
a = 0x7fff5ade795e
a[2] = 3
p+2= 3
a[2]的地址: ,0x7fff5ade7960
p + 2 的地址: 0x7fff5ade7960

指針 + 數(shù)字--> 指針類型指向的類型長度 * 數(shù)字 + 指針本來地址,現(xiàn)在把char 換為int

int a[10] = {'1', '2', '3', '4', '5'};
    int *p = a;

    printf("p = %p\n", p);
    printf("a = %p\n", &a);

    printf("a[2] = %d\n", a[2]);
    printf("p+2= %d\n", *(p + 2));

    printf("a[2]的地址: ,%p\n", &a[2]);
    printf("p + 2 的地址: %p\n", p + 2);

輸出:
p = 0x7fff57360940
a = 0x7fff57360940
a[2] = 51
p+2= 51
a[2]的地址: ,0x7fff57360948
p + 2 的地址: 0x7fff57360948

add_three 和 add_four

int add_three(int a, int b) {
    if (0 == b)
        return a;
    int cxor = a ^b;
    int cand = a & b;
    return add_three(cxor, cand << 1);
}

使用位運算來計算加法,涉及到位的操作.

  • ^ 異火運算符 簡稱不進位加法
    0 ^ 0 = 0
    1 ^ 0 = 1
    1 ^ 1 = 0

  • & 與運算符
    0 ^ 0 = 0
    1 ^ 0 = 0
    1 ^ 1 = 1

使用^ 運算符可以計算出兩個數(shù)相加的所有不進位的值
使用& 運算符可以計算出兩個數(shù)相加的所有進位值,

例如 :

  • 計算 a = 11
    b = 5
    a + b = 16
a = 11 的二進制表示  1011
b = 5 的二進制表示   0101

cxor = a ^ b = 1 0 1 1 
               0 1 0 1
               1 1 1 0 

cand = a & b =  1 0 1 1
                0 1 0 1
                0 0 0 1
然后 cand << 1 = 0010,有進位,再次做運算

cxor = 1110 ^ 0010 = 1100
cand = 1110 & 0010 = 0010 
cand << 1  = 0100, 有進位,再次做運算

cxor = 1100 ^ 0100  = 1000
cand = 1100 & 0100 = 0100
cand << 1 = 1000, 有進位,再次做運算

cxor = 1000 ^ 1000 = 0000
cand = 1000 ^ 1000 = 1000
cand << 1 = 0001 0000 有進位,再次做運算

cxor = 0000  0000 ^ 0001 0000 = 0001 0000
cand = 0000 0000 & 0001 0000 = 0000 0000
cand << 1 = 0 無進位,運算結(jié)束,相加值為 0001 000 = 16  

我們計算一下負數(shù)的相加:
這里我們要清楚的是,所有的數(shù)值在計算機中存儲的都是補碼
將一個整數(shù)巾表,轉(zhuǎn)換成二進制,就是其原碼。如單字節(jié)的5的原碼為:0000 0101衰齐;-5的原碼為1000 0101已维。
反碼:正數(shù)的反碼就是其原碼啊终;負數(shù)的反碼是將原碼中部默,除符號位以外帽蝶,每一位取反绒怨。如單字節(jié)的5的反碼為:0000 0101纯赎;-5的反碼為1111 1010。
補碼:正數(shù)的補碼就是其原碼南蹂;負數(shù)的反碼+1就是補碼犬金。如單字節(jié)的5的補碼為:0000 0101;-5的原碼為1111 1011。

在計算機中晚顷,正數(shù)是直接用原碼表示的(正數(shù)的源碼= 反碼 = 補碼)峰伙,如單字節(jié)5,在計算機中就表示為:0000 0101音同。負數(shù)用補碼表示词爬,如單字節(jié)-5,在計算機中表示為1111 1011权均。

  • 計算 a = - 11
    b = 5
    a + b = - 6
a = -11 在計算機中的二進制補碼表示 1111 0101
b = 5 的二進制表示   0000 0101

cxor = a ^ b = 1111 0101
               0000 0101
                1111  0000

cand = a & b =  1111 0101
               0000 0101
               0000 0101
然后 cand << 1 = 0000 1010 ,有進位,再次做運算

cxor =  1111  0000 ^ 0000 1010= 1111 1010
cand = 1111  0000 &  0000 1010 = 0000 0000
cand << 1 = 0 無進位,運算結(jié)束,相加值為 1111 1010  最高位為 1 說明是負數(shù),現(xiàn)在把補碼轉(zhuǎn)換為源碼:

先減1 ,然后除符號位外按位取反:
減 1 :
1111 1010 - 0000 0001 = 1111 1001 
取反:
1111 1001  ---> 1000 0110

0110  = 6
最高位為 1 所以為 -6 

總結(jié)

  1. 使用到了計算機中數(shù)值的表示,源碼,反碼,補碼 ,計算機中是用補碼來表示數(shù)值的
  2. 使用到地址的運算,與指針的運算
  3. 使用到^異或操作符 與 & 與 操作符.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顿膨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叽赊,更是在濱河造成了極大的恐慌恋沃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件必指,死亡現(xiàn)場離奇詭異囊咏,居然都是意外死亡,警方通過查閱死者的電腦和手機塔橡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門梅割,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葛家,你說我怎么就攤上這事户辞。” “怎么了癞谒?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵底燎,是天一觀的道長。 經(jīng)常有香客問我弹砚,道長双仍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任桌吃,我火速辦了婚禮朱沃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茅诱。我一直安慰自己为流,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布让簿。 她就那樣靜靜地躺著敬察,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尔当。 梳的紋絲不亂的頭發(fā)上莲祸,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天蹂安,我揣著相機與錄音,去河邊找鬼锐帜。 笑死田盈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缴阎。 我是一名探鬼主播允瞧,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛮拔!你這毒婦竟也來了述暂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤建炫,失蹤者是張志新(化名)和其女友劉穎畦韭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肛跌,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡艺配,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衍慎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片转唉。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稳捆,靈堂內(nèi)的尸體忽然破棺而出赠法,到底是詐尸還是另有隱情,我是刑警寧澤眷柔,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布期虾,位于F島的核電站原朝,受9級特大地震影響驯嘱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喳坠,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一鞠评、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壕鹉,春花似錦剃幌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脊凰,卻和暖如春抖棘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工切省, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留最岗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓朝捆,卻偏偏與公主長得像般渡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芙盘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.編譯程序(1)gcc xx.c,他會默認生成一個a.out的可執(zhí)行文件驯用,在a.out所在目錄,執(zhí)行./a.o...
    萌面大叔2閱讀 1,284評論 0 1
  • 網(wǎng)站亂碼問題我們會經(jīng)常碰到何陆,大多見于非英文的中文字符或其他字符亂碼晨汹,而且,這類問題常常是因為編碼方式問題贷盲,主要原因...
    波段頂?shù)?/span>閱讀 2,865評論 1 9
  • 1.編譯程序 (1)gcc xx.c,他會默認生成一個a.out的可執(zhí)行文件淘这,在a.out所在目錄,執(zhí)行./a....
    萌面大叔2閱讀 469評論 0 1
  • 概述 在學(xué)習(xí)位運算之前巩剖,先說下幾個概念: 機器數(shù):一個數(shù)字在計算機中的二進制表達形式就叫做機器數(shù)铝穷。機器數(shù)是有符號位...
    騎著烏龜去看海閱讀 2,446評論 1 4
  • 作者:古典 001 如果為了滿足父母對我們的人生設(shè)想,而放棄自己的夢想佳魔,你就成了受制于人的傀儡曙聂,注定過失敗的人生。...
    明媚月光閱讀 170評論 0 0