1、獲取數字 num 二進制形式第 bit 位的值。
1)bit 從 1 開始
2)返回 0 或 1
方法一:
知識點:數值的toString()方法;charAt()方法返回指定位置的字符,若超過範圍位置,返回空字符,Number()對空字符返回 0。
function valueAtBit(num, bit) {
return Number((num.toString(2)).charAt(num.toString(2).length-bit));
}
方法二:
知識點:位操作符:左移
function valueAtBit(num, bit) {
return num>>(bit-1) & 1;
}
2、給定二進制字符串,將其換算成對應的十進制數字。
方法一:
知識點:擴展運算符可將字符串轉換爲數組。
function base10(str) {
let num = 0;
[...str].reverse().forEach((item,i)=>{
num+=item*Math.pow(2,i);
})
return num;
}
方法二:
知識點:parseInt轉換數值
function base10(str) {
return parseInt(str,2);
}
3、將給定數字轉換成二進制字符串。如果字符串長度不足 8 位,則在前面補 0 到滿8位。
方法一:
知識點:數值的toString()方法;String對象的repeat(time)方法,參數time表示要重複的次數。
function convertToBinary(num) {
let str = num.toString(2);
if(str.length<8){
str="0".repeat(8-str.length)+str;
}
return str;
}
方法二:
知識點:數值的toString()方法;String對象的padStart方法,用來補全字符串。
function convertToBinary(num) {
return num.toString(2).padStart(8,'0');
}
4、求 a 和 b 相乘的值,a 和 b 可能是小數
知識點:JavaScript中Number類型使用 IEEE754 格式來表示整數和浮點數值,使用基於IEEE754 數值的浮點計算有個通病——浮點數值計算會產生舍入誤差的問題。
方法一:把 a 和 b 擴大合適倍數變爲整數,相乘,再除以擴大的倍數。
function multiply(a, b) {
let beiA=beiB=0;
beiA = (""+a).indexOf(".")==-1 ? 0 : (""+a).length-1-(""+a).indexOf(".");
beiB = (""+b).indexOf(".")==-1 ? 0 : (""+b).length-1-(""+b).indexOf(".");
let a1 = a*Math.pow(10,beiA);
let b1 = b*Math.pow(10,beiB);
return a1*b1/Math.pow(10,beiA+beiB);
}
方法二:計算兩小數的小數點位數,然後相加得到保留的小數點位數,再相乘保留相應小數位。
知識點:Number對象的toFixed(x)方法,把數字轉換爲字符串,結果的小數點後有指定 x 位的數字。
function multiply(a, b) {
var re = /\./;
var aDec = a.toString().split('.')[1] || '';
var bDec = b.toString().split('.')[1] || '';
var fix = aDec.length + bDec.length;
return (a * b).toFixed(fix);
}
5、實現(5).add(3).minus(2),使其輸出結果爲:6
知識點:實現鏈式寫法,實例調取方法,只需要把這個方法放到當前實例所屬的原型上。每一個方法執行完,都要返回Number這個類的實例,這樣纔可以繼續調取NUMBER類原型中的方法。
~ function(){
function check(n){
n=Number(n);
return isNaN(n)?0:n;
}
function add(n){
n=check(n);
return this+n;
}
function minus(n){
n = check(n)
return this -n;
}
Number.prototype.add = add;
Number.prototype.minus = minus;
}()