位運算實質是將參與運算的數字轉換爲二進制,然後逐位對應進行運算。java
按位與運算爲:兩位全爲1,結果爲1,即1&1=1,1&0=0,0&1=0,0&0=0。it
例如51 & 5 -> 00110011 & 00000101 = 00000001 -> 51 & 5 = 1table
特殊用法:class
(1)與0相與可清零。效率
(2)與1相與可保留原值,可從一個數中取某些位。例如須要取10101110中的低四位,10101110 & 00001111 = 00001110,即獲得所需結果。容器
兩位只要有一位爲1,結果則爲1,即1|1=1,1|0=1,0|1=1,0|0=0。變量
特殊用法:原理
(1)與0相或可保留原值。硬件
(2)與1相或可將對應位置1。例如,將X=10100000的低四位置1,使X | 00001111 = 10101111便可。二進制
兩位爲「異」,即一位爲1一位爲0,則結果爲1,不然爲0。即1^1=1,1^0=0,0^1=0,0^0=1。
特殊用法:
(1)使指定位翻轉:找一個數,對應X要翻轉的各位爲1,其他爲0,使其與X進行異或運算便可。例如,X=10101110,使低四位翻轉,X ^ 00001111 = 10100001。
(2)與0相異或保留原值。例如X ^ 00000000 = 10101110。
(3)交換兩變量的值。(比藉助容器法、加減法效率高)原理:一個數對同一個數連續兩次進行異或運算,結果與這個數相等。
所以,交換方法爲:A = A ^ B,B = A ^ B,A = A ^ B。
將一個數按位取反,即~ 0 = 1,~ 1 = 0。
將一個數左移x位,即左邊丟棄x位,右邊用0補x位。例:11100111 << 2 = 10011100。
拓展:
==原碼==:一個整數按照絕對值大小轉換爲二進制即爲原碼;
==反碼==:將二進制數按位取反,獲得的即爲反碼;
==補碼==:反碼加1即爲補碼。
==因爲計算機底層硬件的限制,負數均使用補碼錶示。==
若左移時捨棄的高位全爲0,則每左移1位,至關於該數十進制時乘一次2。
例:11(1011) << 2 = 44(11表示爲1011時實際上不完整,若計算機中規定整型的大小爲32bit,則11的完整二進制形式爲00000000 00000000 0000000 00001011)
將一個數右移若干位,右邊捨棄,正數左邊補0,負數左邊補1。每右移一位,至關於除以一次2。
例:4 >> 2 = 1,-14 >> 2 = -4。
將一個數右移若干位,左邊補0,右邊捨棄。
例:-14 >>> 2 = (11111111 11111111 11111111 11110010) >>> 2 = (00111111 11111111 11111111 11111100) = 1073741820
用途 | 方法 |
---|---|
十進制轉成十六進制 | Integer.toHexString(int i) |
十進制轉成八進制 | Integer.toOctalString(int i) |
十進制轉成二進制 | Integer.toBinaryString(int i) |
十六進制轉成十進制 | Integer.valueOf("FFFF", 16).toString() |
八進制轉成十進制 | Integer.valueOf("2234", 8).toString() |
二進制轉成十進制 | Integer.valueOf("0110", 2).toString() |