小編程之查詢字符串包含字符種類

一,關於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。

 

 

發佈了89 篇原創文章 · 獲贊 30 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章