算法: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)) == 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函數正確。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM