把字符串转换成整数

  将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。


代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public int StrToInt(String str) {
if(str.equals("") || str.length()==0) return 0; //非空判断
char[] cs = str.toCharArray();
int res = 0;
int symbol = 1;

if(cs[0] == '-') symbol=-1;

for(int i=(cs[0]=='-' || cs[0]=='+') ? 1:0; i<cs.length; i++){
if(cs[i]<'0' || cs[i]>'9') //if(cs[i]<48 || cs[i]>57)
return 0;
res = (res<<1)+(res<<3)+(cs[i]&0xf);//res=res*10+cs[i]-'0';
/**
* 左移是乘以2的次方(res<<1)+(res<<3) = res*2+res*8 = res*10
* 字符'0'到'9'的ascii值的低4个二进制位刚好就是0到9所以cs[i]&0xf等于cs[i]-'0'。
* 位运算会比乘法运算效率高那么一点点点点...
*
* ASCII码是7位或8位的,如'0'-->十进制48-->二进制0011 0000
* 而十六进制等于四位二进制,如0xf-->二进制1111
* 所以'0' & 0xf == 00110000 & 1111 == 0000 = 十进制0
* 而'0'-'0' == 48 -48 == 0 (减号两边的字符'0'会先被转换为十进制ascii码值48,然后再做运算)
*/
}
return res*symbol;
}
}

---------------- The End ----------------
0%