本文起源於小雷學習hashmap原理時看到hashmap擴容機制發現本身對二進制運算忘得差很少了,可能大部分人和我差很少,日常工做中用不到的技術,你學習了是不錯,可是忘記的會很快,這就須要咱們常常性的複習咱們學習過的技術(這裏手動狗頭棒砸向本身)bash
將十進制數除以2直至商爲0或者1,將每一步的餘數記錄下來,而後將餘數反過來就是相應的二進制了網絡
例子:十進制8轉二進制學習
第一次8除以2得4餘0,第二次4除以2得2餘0,第三次2除以2得1餘0,最後餘1,獲得的餘數依次爲0001。ui
反過來就是1000,計算機內部表示數的長度是固定的,好比8位,16位,32位,位數不足在高位補齊(爲何在高位,由於在高位補0對這個數沒影響)spa
Java代碼實現:code
public class mapHashCodeTest {
public static void main(String[] args) {
String str = toBinary(8);
System.out.println(str);
}
static String toBinary(int num) {
String str = "";
while (num != 0) {
str = num % 2 + str;
num = num / 2;
}
return str;
}
}
複製代碼
二進制1000 ,轉十進制的話,只要拿對應位上的0、1數字乘以2的冪(這裏的冪次從個位開始算,個位是零,依次日後推)cdn
8 = 0 * 2(0次冪) + 0 * 2(1次冪) + 0 * 2(2次冪) + 0 * 2(3次冪)blog
能夠直接調用Integer.parseInt()實現,例如:ip
System.out.println(Integer.parseInt("1000",2));
複製代碼
結果爲:8string
若是是二進制數則能夠直接進行運算,若是是十進制或者十六進制則須要轉換爲二進制進行運算。運算規則爲:從個位開始,兩個數都爲1則爲1,不然爲0
例如:
8的二進制爲1000, 9的二進制爲1001,位與運算後爲1000
代碼實現:
int a = 8;
int b = 9;
System.out.println(a&b); // 結果爲8
複製代碼
與運算在不少場景中都會用到,例如ip地址和子網掩碼進行與運算獲得網絡地址。
兩個數都轉爲二進制數,運算規則:從個位數開始,兩個數只要有一個爲1則爲1,不然爲0。
例如:
8的二進制爲1000, 9的二進制爲1001,位或運算後爲1001
代碼實現:
int a = 8;
int b = 9;
System.out.println(a|b); // 結果爲9
複製代碼
五、位異或運算(^)
運算規則是:兩個數轉爲二進制,而後從高位開始比較,若是相同則爲0,不相同則爲1。
例如:
8的二進制爲1000, 9的二進制爲1001,位異或運算後爲0001
代碼實現:
int a = 8;
int b = 9;
System.out.println(a^b); // 結果爲1
複製代碼
接下來比較繞,請仔細看
將數轉爲二進制數,運算規則:從個位數開始,位爲1則爲0,位爲0則爲1。
Java中全部數據的表示方法都是以補碼的形式表示,若是沒有特別說明,Java中的數據類型默認是int, int數據類型的長度是8位,一位是4字節,就是32字節,32bit。
例如:
8的二進制爲1000,
補碼後爲:0000 0000 0000 0000 0000 0000 0000 1000
取反爲:1111 1111 1111 1111 1111 1111 1111 0111
由於高位是1,因此原碼爲負數,負數的補碼是其絕對值的原碼取反,末尾再加1
所以咱們可將這個二進制數的補碼進行還原,
末尾減1得反碼:1111 1111 1111 1111 1111 1111 1111 0110
將反碼取反得原碼:0000 0000 0000 0000 0000 0000 0000 1001
去除補碼位得1001,因此8位非獲得-9
代碼實現:
int a = 8;
System.out.println(~a); //結果爲-9
複製代碼
若是你喜歡本文,
請掃描二維碼關注獲取更多文章