《面試題》java基礎知識易錯點

2021-07-05 21:01:24 字數 2555 閱讀 9176

1)關於a++與++a的辨析;以如下**為例:

int m2 = 4;

int n2 = 5;

// 使用&邏輯運算子:

// if (m2++ > 4 & ++n2 > 5)

// system.out.println(m2 + "---" + n2);//輸出結果為5---6

// 使用&&邏輯運算子

if (m2++ > 4 && ++n2 > 5)

system.out.println(m2 + "---" + n2);// 輸出結果為5---5

2)位運算子:位運算子包括與&、或|、非~、異或^、左移<<、右移》等。

與:都為1,結果才為1,否則為0;

或:全為0,才為0,否則為1;

非:按位取反;

異或:相同取0,不同取1;

下面對位操作的一些常見應用作個總結,有判斷奇偶、交換兩數、變換符號及求絕對值。這些小技巧應用易記,應當熟練掌握。

只要根據最未位是0還是1來決定,為0就是偶數,為1就是奇數。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)來判斷a是不是偶數。

下面程式將輸出0到100之間的所有奇數。

[cpp]view plain

copy

for(i = 0; i < 100; ++i)  

if(i & 1)  

printf("%d "

, i);  

putchar('\n'

);  

一般的寫法是:

[cpp]view plain

copy

void

swap(

int&a, 

int&b)  

}  可以用位操作來實現交換兩數而不用第三方變數:

[cpp]view plain

copy

void

swap(

int&a, 

int&b)  

}  可以這樣理解:

第一步  a^=b 即a=(a^b);

第二步  b^=a 即b=b^(a^b),由於^運算滿足交換律,b^(a^b)=b^b^a。由於乙個數和自己異或的結果為0並且任何數與0異或都會不變的,所以此時b被賦上了a的值。

第三步 a^=b 就是a=a^b,由於前面二步可知a=(a^b),b=a,所以a=a^b即a=(a^b)^a。故a會被賦上b的值。

再來個例項說明下以加深印象。int a = 13, b = 6;

a的二進位制為 13=8+4+1=1101(二進位制)

b的二進位制為 6=4+2=110(二進位制)

第一步 a^=b  a = 1101 ^ 110 = 1011;

第二步 b^=a  b = 110 ^ 1011 = 1101;即b=13

第三步 a^=b  a = 1011 ^ 1101 = 110;即a=6

變換符號就是正數變成負數,負數變成正數。

如對於-11和11,可以通過下面的變換方法將-11變成11

1111 0101(二進位制) –取反-> 0000 1010(二進位制) –加1-> 0000 1011(二進位制)

同樣可以這樣的將11變成-11

0000 1011(二進位制) –取反-> 0000 0100(二進位制) –加1-> 1111 0101(二進位制)

因此變換符號只需要取反後加1即可。完整**如下:

[cpp]view plain

copy

//by morewindows(  )  

#include 

intsignreversal(

inta)  

intmain()  

位操作也可以用來求絕對值,對於負數可以通過對其取反後加1來得到正數。對-6可以這樣:

1111 1010(二進位制) –取反->0000 0101(二進位制) -加1-> 0000 0110(二進位制)

來得到6。

因此先移位來取符號位,int i = a >> 31;要注意如果a為正數,i等於0,為負數,i等於-1。然後對i進行判斷——如果i等於0,直接返回。否之,返回~a+1。完整**如下:

[cpp]view plain

copy

//by morewindows(  )

intmy_abs(

inta)    

現在再分析下。對於任何數,與0異或都會保持不變,與-1即0xffffffff異或就相當於取反。因此,a與i異或後再減i(因為i為0或-1,所以減i即是要麼加0要麼加1)也可以得到絕對值。所以可以對上面**優化下:

[cpp]view plain

copy

//by morewindows(  )

intmy_abs(

inta)    

注意這種方法沒用任何判斷表示式,而且有些筆面試題就要求這樣做,因此建議讀者記住該方法(^_^講解過後應該是比較好記了)。

js基礎知識易錯點(一)

最近替另乙個專案招人,要求基礎知識好,隨便問了一些基礎題,發現了一些易錯的點,總結一下。1 判斷乙個空陣列 var arr 1 json.stringify arr 2 arr instanceof array arr.length 0 3 array.prototype.isprototypeof...

php面試題 難點易錯點(一)

前言 錄製一 php負數求餘及布林型別初探 1.php求余中的負數 8 3 2 8 3 2 8 3 22.php中奇怪的布林型別 a true a echo a.1 a 1 echo a 2 b true b 1 echo b 2 4.前端收到賬號資訊會展示出來。7.網頁端拿到token就可以登陸成...

Java 易錯知識點

1 以下程式執行的結果是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 classx classy publicclasszextendsx publicstaticvoidmain string args zyxx zyxy yxyz xyz...