如题,题目很简单,只是统计一个十进制数字转为二进制数后1的个数。
思路:
本题逻辑很简单,由于Integer中有转换数字进制的方法,所以很容易得到二进制数字。
但是方法返回的为String类型,因此涉及基本类型的转换,需要特别注意。
注意:
Integer.toBinaryString(int)
返回值为String
类型。- String 拆解为CharArray()后还需要转为Int类型。
- 特别注意:Char --> Integer的时候不可以直接使用等于,否则会按照ASCII码转换。
应:使用以下方法正确转换:
对应方法为:Integer.valueOf(String.valueOf(c));
正确代码:
package com.JZOffer;
public class 二进制中1的个数 {
public static void main(String[] args) {
int a = -2;
String bin = Integer.toBinaryString(a);
int ans = 0;
char[] charbin = bin.toCharArray();
for (char i : charbin) {
ans += Integer.valueOf(String.valueOf(i));
}
System.out.println(ans);
}
}
另外,Integer.ParseInt()与Integer.valueOf()的区别:(可以直接看最后结论)
查看源码可知:
- 当
valueOf(int)
时,实际上为int的装箱操作。(并不需要手动调用)
但是这里注意,当valueOf()参数为char时,会被当做int处理,此时会当做Ascii处理! - 当
valueOf(String)
时,实际上是调用parseInt(s, 10)
方法,并包装为Integer类型。
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
- 我们再看
parseInt()
,主要看到它返回的是int类型。
public static int parseInt(String s, int radix)
throws NumberFormatException{
//BALA BALA 一大堆
}
实验:
总结:
Integer.ParseInt(String)
参数只能为String
!只针对String
类型!- 当参数类型为
String
时,Integer.ParseInt(String)
返回int,Integer.valueOf(String)
返回Integer,无区别。- 由于
Integer.valueOf()
参数可以为String或int,所以支持很多类型的参数:
1. 当参数为byte, char, short
等能自动转换为int
的类型时,会自动转换,当为float
时报错。
2. 特殊的:当参数类型为char
时,Integer.valueOf()
会计算char
的Ascii码值。即int a='1' // a=49
。
(本次结果均为自己调研结果,可能不严谨,有漏洞望大神指正!)