小编程之查询字符串包含字符种类

一,关于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。

猜你喜欢

转载自blog.csdn.net/wannuoge4766/article/details/104152297