《Thinking in java》基礎篇之位運算

2021-07-22 18:41:21 字數 4502 閱讀 2962

分類

在計算機中所有資料都是以二進位制的形式儲存的。位運算其實就是直接對在記憶體中的二進位制資料進行操作,因此處理資料的速度非常快。

符號位:二進位制數最高位表示符號位,0表示正數,1表示負數。

原碼:整數的二進位制數。

反碼:符號位不變,其餘部分取反。

補碼:原碼取反+1,符號位不變。或者說反碼+1,符號位不變。

負數的原碼即為:正數的原碼取反,再加1,即正數的補碼就是負數的原碼。

比如11和-11

11的原碼:00000000 00000000 00000000 00001011

11的反碼:01111111 11111111 11111111 11110100

11的補碼:01111111 11111111 11111111 11110101

-11的原碼:11111111 11111111 11111111 11110101

位操作符分為兩類:

1.按位操作符

2.移位操作符

按位操作符用來操作整數基本資料型別中的單個「位元(bit)」,即二進位制。按位操作符會對兩個引數中的位執行布林代數運算,並最終生成乙個結果。
1.按位「與」操作符(&)

解釋:對兩個整數的二進位制形式逐位進行邏輯與 運算

如果兩個輸入位都是1,那麼按位「與」(&)操作就會生成乙個輸出位1,否則生成乙個輸出位0。

1&1=1;

1&0=0;

4&-5=0;

4&-5分析:

4的二進位制:00000000 00000000 00000000 00000100

-5的二進位制:11111111 11111111 11111111 11111011

所以4&-5的二進位制為 00000000 00000000 00000000 00000000

轉換為10進製為0。

所以4&-5=0;

2.按位「或」操作符(|)

解釋:對兩個整數的二進位制形式逐位進行邏輯或運算。

如果兩個輸入位都是1,那麼按位「或」(|)操作符生成乙個輸出位1,只有兩個輸入位都是0的情況下,才會生成乙個輸出位0。

1

|0=1;

0|0=0;

4|-5=-1;

同樣以4|-5為例:

4|-5:

4的二進位制:00000000 00000000 00000000 00000100,

-5的二進位制:11111111 11111111 11111111 11111011,

逐位進行邏輯或運算:11111111 11111111 11111111 11111111,即得到-1.

3.按位「異或」操作符(^)

解釋:對兩個整數的二進位制形式逐位進行邏輯異或運算。

如果輸入位的某乙個是1,但不全都是1,那麼按位「異或」(^)操作,生成乙個輸出位1。

1^1

=0;1

^0=1;

0^0=0

;4^-5=-

1;

4^-5:

4的二進位制:00000000 00000000 00000000 00000100,

-5的二進位制:11111111 11111111 11111111 11111011,

逐位進行邏輯異或運算:11111111 11111111 11111111 11111111,即得到-1.

4.按位非(~)

解釋:對兩個整數的二進位制形式逐位進行取反。

按位非(~)操作符,也稱為取反操作符。它屬於一元操作符,只對乙個數進行操作(其他按位操作符是二元操作符),按位「非」生成與輸入位相反的值,若輸入0,則輸出1;若輸入1,則輸出0。

~4=-5;
4的二進位制形:00000000 00000000 00000000 00000100,逐位取反後得11111111 11111111 11111111 11111011,即為-5。

移位操作符操作的運算物件也是二進位制的「位」。移位操作符只能用來處理整數型別。移位操作符分為:1.左移位操作符(<<),2.「有符號」右移位操作符(>>),3.「無符號」右移操作符(>>>)。
1.左移位操作符(<<)

例如:4<<2

4的二進位制形式: 00000000 00000000 00000000 00000100,進行左位移2位,得到00000000 00000000 00000000 00001000,即為16.

10737418<<8

10737418二進位制表示形式:00000000 10100011 11010111 00001010,進行左位移2位,得到10100011 11010111 00001010 00000000,即為:-1546188288.

2.有符號右位移操作符(>>)

m>>n的含義:把整數m表示的二進位制數右移n位,m為正數,高位全部補0;m為負數,高位全部補1。

例如 4>>2

4的二進位制形式: 00000000 00000000 00000000 00000100,進行右位移2位,得到00000000 00000000 00000000 00000000,即為1.

-4>>2剖析:

-4二進位制形式: 11111111111111111111111111111100,右移2位,得到11111111 11111111 11111111 11111111,即為-1.

ps:每 個整數表示的二進位制都是32位的,如果右移32位和右移0位的效果是一樣的。依次類推,右移32的倍數字都一樣。相當於整體全移。與移0位相同。左移也是一樣的。

3.無符號右移操作符(>>>)

m>>>n:整數m表示的二進位制右移n位,不論正負數,高位都補零。

例如: 4>>>2:

4二進位制形式: 00000000 00000000 00000000 00000100,右移兩位,得到00000000 00000000 00000000 00000001,即為1。

-4>>>2:

-4二進位制形式: 11111111111111111111111111111100,右移兩位,得到00111111 11111111 11111111 11111111,即為1073741823.

備註

對於移位操作符如果n為負數:這時jvm會先讓n對32取模,變成乙個絕對值小於32的負數,然後再加上32,直到 n 變成乙個正數。

例如:

4<<-10

4的二進位制形式:00000000 00000000 00000000 00000100,-10對32取模再加上32,不用說了,得到22,則4<<-10,即相當於4<<22。

此時按照再左移22位,得到00000001 00000000 00000000 00000000,得到的即為:16777216。

4.其他非整型數值位移處理

如果對char,byte或者short型別的數值進行位移處理,那麼在移位之前會,它們會被轉為int型別,並且得到的結果也是int型別的值。只有數值有段的低5位才有用。這樣可以防止我們移位超過int型所具有的位數。(2的5次方等於32,int只有32位)。

「移位」可以與「等號」(<<=或》=或》=組合使用)。此時,操作符左邊的值會移動指定的位數,然後將結果複製給左邊的變數。但在進行「無符號」右移位集合結合賦值操作時,會出現乙個問題:如果對byte或short值進行這樣的移位運算,得到的可能不是正確的結果。它們會先被轉成int型別,然後進行右移操作,然後被截斷,再賦值給原來的型別。

例如:

public

static

void

main(string args)

輸出的結果為

-4 -4

508

這說明了在操作a <<= 2 執行過程是這樣的:先將 byte型的數 127變成int型,左移2位得到 508,然後把508賦給byte型變數a時只是簡單地」折斷」(truncate)得到數-4。編譯時編譯器不會提示你可能損失精度(實際上在本例中確實是損失精度了)。

異常使用 ThinkingInJava

1.在恰當的級別處理問題。在知道該如何處理的情況下才捕獲異常 2.解決問題並且重新呼叫產生異常的方法。3.進行少許修補,然後繞過異常發生的地方繼續執行。4.用別的資料進行計算,以代替方法預計會返回的值。5.把當前執行環境下能做的事情盡量做完,然後把相同的異常重拋到更高層。6.把當前執行環境下能做的事...

Thinking in java 學習筆記(二)

5.4 類訪問 對於類的訪問只有兩種 友好 沒有修飾符,包內可見 和public 5.6 內部類可以相互訪問protected修飾的方法和資料,private修飾的方法和資料不能訪問,友好 修飾的方法和資料可以相互訪問。protected 它本身是私有的,但可由從這個類繼承的任何東西或者同乙個包內的...

4 ThinkingInJava學習筆記

今天的學習筆記,一天一記 1.建構函式只能在構造器中呼叫,而且只能呼叫最多乙個建構函式。2.如果乙個類沒有實現構造器,那麼就有乙個預設構造器 無參 如果實現了乙個構造器之後,必須有乙個無參構造器。3.finalize 函式釋放資源不靠譜,對於占用的一些系統資源比如檔案控制代碼等,最好還是自己實現乙個...