演算法:java列印int型別的二進位制格式
java列印一個int型別的二進位制
int型別佔4個位元組,一個位元組8位,int共佔32位。java中的int是無符號的(c語言還區分int整形和unsigned int無符號整型),取值範圍 -231~231-1。
二進位制數在記憶體中以補碼的形式儲存的
正數:補碼就是轉化為二進位制
負數:補碼符號位是1,其它位是對應正數的二進位制的取反加一
例如2的二進位制就是:00000000000000000000000000000010 左起第一位是符號位, 0表示正數,其餘後面31位是數值位。
-2的二進位制是:11111111111111111111111111111110 ,左起第一位是符號位是1表示負數,後面31位是2的二進位制取反加一。
(這塊不太熟悉可以看這裡
給出一個int的十進位制數字,比如2,怎麼用java程式打印出它的二進位制表示00000000000000000000000000000010呢?
思路:我們看到的十進位制 int a = 2; 只是java給我們做了格式化顯示成了“2”,我們心裡很清楚底層儲存是00000000000000000000000000000010,要是能和計算機進行一個溝通,去到記憶體中找到a這塊記憶體區域,拿一根探針,挨個問每一塊小記憶體是0還是1,然後你把結果打印出來就能顯示出二進位制表示了。int有32位,所以我們就需要拿著“探針”問記憶體32次才能得到每一位是0還是1,怎麼尋找這根“探針”呢?
可以用
10000000000000000000000000000000,
01000000000000000000000000000000,
00100000000000000000000000000000,
00010000000000000000000000000000,
.....
00000000000000000000000000000010,
00000000000000000000000000000001,
這樣的,從第32位一直到第1位,一次只有一位是1,其它位都是0的,32個二進位制數做“探針”。與2(的二進位制)進行與(&)32次,這一系列“探針”數字有個特點就是,第n個“探針”和2與之後,如果是1說明2的二進位制當前位是1,如果是0說明2的當前位是0。
第一次與
探針: 10000000000000000000000000000000
2的二進位制:00000000000000000000000000000010
結果: 0
第二次與
探針 :01000000000000000000000000000000
2的二進位制:00000000000000000000000000000010
結果: 0
第三次與
探針 :00100000000000000000000000000000
2的二進位制:00000000000000000000000000000010
結果: 0
......
第31次與
探針: 00000000000000000000000000000010
2的二進位制:00000000000000000000000000000010
結果: 1
第32次與
探針: 00000000000000000000000000000001
2的二進位制:00000000000000000000000000000010
結果: 0
java程式碼:
public static void print(int num){
for(int i=31;i>=0;i--){
System.out.print(((num & 1 << i) & num) == 0 ? "0":"1");
}
}
解釋:
for迴圈裡每次num和1右移i位進行與操作,i從31開始,每次減減,一直到0,正好是32位,這就是上面說的32個探針,去探測num的當前位是0還是1。
驗證:
print(2); 輸出00000000000000000000000000000010
print(-2); 輸出11111111111111111111111111111110 (符號位是1,數值位是2的二進位制取反加一,正確)
print(100);輸出00000000000000000000000001100100
說明print函式正確。
歡迎關注個人公眾號一起交流學習: