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