1. 程式人生 > 實用技巧 >演算法:java列印int型別的二進位制格式

演算法: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的二進位制取反加一。

(這塊不太熟悉可以看這裡

https://www.cnblogs.com/lihaoyang/p/14156988.html

給出一個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函式正確。

歡迎關注個人公眾號一起交流學習: