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;
}()