parseInt、toString与进制的关系,parseinttostring
parseInt、toString与进制的关系,parseinttostring
今天看到一道题,[“1”,”2”,”3”].map(parseInt) ,答案会输出什么?
很多人会想到 [ 1, 2, 3] ,但是答案是 [ 1,NaN, NaN ]。一开始我也是懵逼的,不知道为什么,下午查了一些资料,总算知其原因,问题出在parseInt 的参数上面,而且这种情况平时很难遇到,工作也基本用不到,下面我简单说下。这个与进制有关,另外后面再补充下toString的罕见用法,关于map的用法,在这里就不介绍了,网上介绍的比较多。
parseInt
对于parseInt的基本用法,大家都知道,我们一般用他来把一个小数或字符串转换为整数。
parseInt(21.2)//返回21
parseInt(‘17’)//返回Number类型的17
另外的用法是,parseInt可以接收两个参数,我们平常都是使用了第一个参数,但是它还有第二个参数。并且parseInt.length=2
我们看看MDN上对第二个参数的解释:
一个2到36之间的整数值,用于指定转换中采用的基数。比如参数”10”表示使用我们通常使用的十进制数值系统。总是指定该参数可以消除阅读该代码时的困惑并且保证转换结果可预测。当忽略该参数时,不同的实现环境可能产生不同的结果。
文字不好形容,下面咱们就来实例解释下:
parseInt(101,2)//返回5
parseInt(8,3)//返回NaN
parseInt(16,3)//返回1
parseInt('dsff66',16)//返回13
看到第一个例子,大家是不是就恍然大悟了,第一个表达的意思是把2进制101,转化成十进制是几,答案就是5。
同理对于第二个例子,意思就是把3进制8转化成的数字是几。那么为什么是NaN呢,其实很简单,大家仔细看下,3进制会出现8吗?在3进制里面,生成最大的数是2。有一个规律,生成最大的数总比进制数小1,比如十进制最大的数是9等等。对于那些不可能出现的数,自动忽略,但是忽略以后就没有数了,转化就是NaN。
下面来看第三个例子,parseInt(16,3)
,出现最大的数字是2,那么6就是被自动忽略掉(),所以parseInt是直接用三进制去解析1,得到的当然是1了。
最后一个parseInt('dsff66',16)
,我们知道,平时使用parseInt,它会忽略到除数字之外的字符,但是这里不一样,因为十进制最大的数字是9,但是到了十一进制往上,最大的数字是两位数了,这当然不行,所以从10开始往上,就用字母代替,a==10,b==11……z==35;所以这就是为什么parseInt的第二个参数要规定在2~36了。
再看看上面这道问题,在16进制中,最大的数字是15,对应字母也就是f,超过f的字母也就超出了16进制的解析范围。
关于parseInt就说到这里,下面补充下toString和进制的关系。
toString
基本用法是用于将当前对象以字符串的形式返回。
比如:
(56).toString(); //返回"56"
重要的是toString(),括号里面可以传参,参数代表进制数,这个和parseInt第二个参数一样。但是总的用法正好和parseInt反过来,一个是把多少进制转换成10进制,另外一个是把十进制转换成多少进制。toString属于后者。
例子:
(5).toString(2);//返回字符串"101"
上面意思就是把5转换成2进制是多少,结果返回一个字符串。
之前看过一道算法面试题,如下:
如何利用位操作判断一个整数是不是2的整数次方
这道题其实思路很多,但是比较简单的方法我感觉是先把这个数转化为二进制,如果是2的整数次方,那么第一位是1,其余都是0。如果满足了这个,那么这个数就是2的整数次方。我自己写的代码如下,如果有误,请指正,我就不会详细介绍每一步了,已经说了大概思路
function a(num) {
var flag = true;
if (num==0) {
return false;
}
num = num.toString(2).split("");
for(var i=1;i<num.length;i++){
if (num[0]!=1 || num[i]==1) {
flag = false;
}
}
return flag;
}
就介绍到这里吧,写东西太费时间了,一两个小时过去了。
相关文章
- 暂无相关文章
用户点评