最近在看到java的位運算,這塊到目前為止也沒有用到過,因為不知道怎么用所以總感覺學不會。當然看到這里就想到之前看到過幾次的java實現兩個變量值交換,不通過中間變量的問題。又忘記了原理,各種搜索之后還是總結一下記下來吧。
首先只有兩個變量,相互交換值。因此每個值不能丟掉,且暫存變量有兩個,因此原理則是將兩個變量融合成一個變量放入一個暫存變量,然后變量和再和另一個暫存變量運算賦值為暫存變量,這時運算中的暫存變量便是交換值之后的變量。
public class ChangeDemo { public static void main(String[] args) { int a = 3; int b = 4; a = a + b; b = a - b; a = a - b; System.out.println("a = " + a); System.out.println("b = " + b); } }
當然也可以考慮其他運算,需要考慮一些為0的條件。再有就是還可以考慮位運算中的異或操作。
public class ChangeDemo { public static void main(String[] args) { int a = 3; int b = 4; a = a ^ b; b = a ^ b; a = a ^ b; System.out.println("a = " + a); System.out.println("b = " + b); } }
原理同上,這里想說一下,位運算和邏輯運算還沒有區分一下。首先樣子上,邏輯運算上“&&”, “||”,則是兩個的,而位運算上"&","|","^"為一個的。邏輯運算是對兩個關系運算符來進行邏輯運算,兩邊的結果為true或false.而位運算則是對兩個二進制數的位進行邏輯運算。
上面代碼中a的位表示為011,b的位表示為100,(異或則是兩位相同為0,不相同為1)進而異或結果為a為111.將111與b異或后賦值為b,此時b為011,即為3,將此時的b 011與a 111異或賦值為a,即為100,即為4.
說到位運算,想到看到的一點是左移位,則右側補充0,而”有符號“的右移位,則符號指定為正時,左側補充0,符號為負時,左側補充1.還沒實際使用。