位運算實現(xiàn)四則運算

    有時候肴颊,我們?yōu)榱俗非笮拭フ唬蛘吣承﹫鼍跋拢赡茚槍\算方式進(jìn)行調(diào)整

比如說苫昌,不同語言進(jìn)行數(shù)據(jù)傳輸?shù)臅r候颤绕,數(shù)據(jù)類型精度不匹配幸海,如何盡量減少這種情況的發(fā)生
就需要使用到一些位運算的技巧了祟身。
拋開語言層面,僅從邏輯出發(fā)即可物独,以下代碼袜硫,都可以使用其他語言方式替換

/**
 * 兩數(shù)加法運算
 * **/
const add = function (num1, num2) {
    //進(jìn)位運算為0則結(jié)束
    if (num2 === 0) {
        return num1;
    }
    //沒有進(jìn)位的運算 亦或操作,(兩不相等則1)
    let sum = num1 ^ num2;
    //與操作挡篓,同1 則1婉陷,這時候使用左移一位的操作表示進(jìn)位
    let carry = (num1 & num2) << 1;
    return this.add(sum, carry);
}
/**
 * 兩數(shù)減法運算
 * 減法帚称,簡單的做法就是把減法看做是加法,(加一個負(fù)數(shù))
 * **/
const plus = function (num1, num2) {
    //取反相加
    let num3 = this.add(~num2, 1);
    let result = this.add(num1, num3);
    return result;
}
/**
 * 兩數(shù)乘法運算m * n
 * 實際上就是將m進(jìn)行n次相加運算秽澳,但是要考慮到負(fù)數(shù)的情況等
 * 所以需要對負(fù)數(shù)進(jìn)行取反處理
 * **/
const multi = function (num1, num2) {
    let a = num1 < 0 ? this.add(~num1, 1) : num1;
    let b = num2 < 0 ? this.add(~num2, 1) : num2;
    let result = 0;
    while (b > 0) {
        //取尾數(shù)闯睹,因為要累加
        if ((b & 0x1) > 0) {
            result = this.add(result, a);
        }
        //每次運算結(jié)束,被乘數(shù)進(jìn)行一次左移運算担神,進(jìn)位的操作
        a = a << 1;
        //乘數(shù)進(jìn)行一次右移操作楼吃,表示要執(zhí)行次數(shù)
        b = b >> 1;
    }
    //亦或操作,兩不相等則1妄讯,判斷正負(fù)號孩锡,取最高位比較,如果為負(fù)數(shù)亥贸,則取反加一
    if ((num1 ^ num2) < 0) {
        result = this.add(~result, 1);
    }
    return result;
}
/**
 * 兩數(shù)除法運算
 * 后續(xù)實現(xiàn)躬窜,目前僅用的到加法與乘法
 * **/
const division = function (num1, num2) {
      //可以想一想如何使用位運算實現(xiàn)除法的方式
}

/**
     * java實現(xiàn)
     * 兩數(shù)除法運算
     * @param decimals 保留幾位小數(shù),默認(rèn)保留10位
     * **/
    public static Long divide(Long d1, Long d2, int decimals){
        long a = d1 >> 63 == 1 ? add(~d1, 1L) : d1;
        long b = d2 >> 63 == 1 ? add(~d2, 1L) : d2;
        long result = 0;
        // 余數(shù)
        long remainder = 0;
        //累加:整體表示炕置,以雙倍的加法計算荣挨,提升效率。(b & 0x1) > 0時候才累加一次朴摊;
        while(a >= b){
            result = add(result, 1L);
            a = subtraction(a, b);
        }
        //判斷符號位垦沉,異或操作,同位同值則0仍劈,否則1,厕倍;與負(fù)負(fù)得正,一負(fù)為負(fù)相同贩疙,故可根據(jù)亦或操作判斷符號
        if((d1 ^ d2) < 0){
            result = add(~result, 1L);
        }
        //獲取余數(shù)符號
        remainder = d2 > 0 ? a : add(~a, 1L);
        return result;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讹弯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子这溅,更是在濱河造成了極大的恐慌组民,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悲靴,死亡現(xiàn)場離奇詭異臭胜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)癞尚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門耸三,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浇揩,你說我怎么就攤上這事仪壮。” “怎么了胳徽?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵积锅,是天一觀的道長爽彤。 經(jīng)常有香客問我,道長缚陷,這世上最難降的妖魔是什么适篙? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮箫爷,結(jié)果婚禮上匙瘪,老公的妹妹穿的比我還像新娘。我一直安慰自己蝶缀,他們只是感情好丹喻,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翁都,像睡著了一般碍论。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柄慰,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天鳍悠,我揣著相機(jī)與錄音,去河邊找鬼坐搔。 笑死藏研,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的概行。 我是一名探鬼主播蠢挡,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凳忙!你這毒婦竟也來了业踏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤涧卵,失蹤者是張志新(化名)和其女友劉穎勤家,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柳恐,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡伐脖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乐设。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讼庇。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伤提,靈堂內(nèi)的尸體忽然破棺而出巫俺,到底是詐尸還是另有隱情,我是刑警寧澤肿男,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布介汹,位于F島的核電站,受9級特大地震影響舶沛,放射性物質(zhì)發(fā)生泄漏嘹承。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一如庭、第九天 我趴在偏房一處隱蔽的房頂上張望叹卷。 院中可真熱鬧,春花似錦坪它、人聲如沸骤竹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒙揣。三九已至,卻和暖如春开瞭,著一層夾襖步出監(jiān)牢的瞬間懒震,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工嗤详, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留个扰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓葱色,卻偏偏與公主長得像递宅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苍狰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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