一,关于ASCII码
ASCII码
if(c<32) 控制字符
else if(c>'0'&&c<'9') 数字
else if(c>'a'&&c<'z') 小写字母
else if(c>'A'&&c<'Z') 大写字母
else 其它字母
二,代码
如何判断一个字符串含有以上所有类别的字符(假定字符分为以上5类)
private int method( String str )
{
byte condition = 0;
for ( int i = 0; i < str.length(); i++ )
{
char c = str.charAt( i );
if ( c >= 'a' && c <= 'z' )
{
condition |= 1;
}
else if ( c >= 'A' && c <= 'Z' )
{
condition |= 2;
}
else if ( c >= '0' && c <= '9' )
{
condition |= 4;
}
else if ( c <= 32 || c >= 127 )
{
condition |= 16;
}
else
{
condition |= 8;
}
}
int res = 0;
for ( int i = 0; i < 5; i++ )
{
if ( ( ( condition & 0xff ) & ( 1 << i ) ) != 0 )
{
res++;
}
}
return res;
}
三,为什么byte型要&0xff
首先要知道0x指的是16进制,0xff转成二进制是11111111,在32位中首24位置为0,表示成00000000 00000000 00000000 11111111。所以byte型和0xff做与运算实际上是取byte值的末8位,使结果的前24位都为0,保证二进制的一致性。
计算机存储数值是按补码存储的(补码模运算对符号位的自动处理),java基本类型从小到大扩展时,负数补0扩展和补符号位扩展完全不同。补符号位扩展会保证10进制数相同;补0扩展保证了补码相同。也就是说赋值情况下,对于操作数与结果,如果我们想要十进制的两个数相同,那直接通过赋值补码补符号位就可以做到,但会造成二进制数的混淆。我们想要二进制的两个数相同就要把byte型&0xff,就可以保证,但会造成十进制的结果互不相同。
而计算机实际操作中,往往需要计算的是二进制,比如我们遇到的情况往往是把文件流转换成byte数组等, 当不需要十进制的比较都推荐使用&0xff保证两个数的二进制相同,本题中condition初始为0,即使不做与运算结果看似也是一致,但即使这样为了工程的鲁棒性,也推荐&0xff。