JS大數運算

/**
 * 大數與或操作
 */
global.andorOpera = function (a, b, type) {
    //type = 1是與運算,type = 2 是或運算,默認是與運算
    a          = a + "";
    b          = b + "";
    var aStr   = toBin(a);
    var bStr   = toBin(b);
    var longer = aStr.length > bStr.length ? aStr : bStr;
    var sorter = aStr.length > bStr.length ? bStr : aStr;
    var _tstr  = "",
        _fix   = longer.length - sorter.length;
    for (var i = longer.length - 1; i >= 0; i--) {
        if (type == 2) {
            //或運算
            _tstr += longer[i] == 1 || sorter[i - _fix] == 1 ? 1 : 0;
        } else {
            //與運算
            _tstr += longer[i] == 1 && sorter[i - _fix] == 1 ? 1 : 0;
        }
    }
    // return parseInt(_tstr.split("").reverse().join(""),2);
    return tobigInt(_tstr.split("").reverse().join(""));
}

//大數轉二進制
function toBin(str) {
    var arr = [];
    var remainder, i, str2, num, char;
    while (str.length > 0) {
        str2      = "";
        remainder = 0;
        for (i = 0; i < str.length; i++) { // str2 = str組成的十進制數 / 2
            num  = str.charCodeAt(i) - 0x30; // num to String
            num  = remainder * 10 + num;
            char = Math.floor(num / 2).toString();
            // 忽略最高爲的0 , 即最高爲如果是 0 則不放入 str2
            if (!(char === "0" && str2 === "")) {
                str2 += char;
            }
            remainder = num % 2;
        }
        str = str2;
        arr.push(remainder); // 保存餘數
    }
    return arr.reverse().join('');
}

//二進制轉大數 BigNumber = require('big-number');
function tobigInt(str) {
    str        = str.split("");
    var length = str.length;
    var temp   = "0";
    for (var i = length - 1; i >= 0; i--) {
        temp = BigNumber(temp).add(str[i] == "1" ? (BigNumber("2").pow(length - 1 - i).number.reverse().join("")) : 0).number.reverse().join("");
    }
    return temp;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章