官术网_书友最值得收藏!

2.5 整數(shù)

簡單地說,整數(shù)就是沒有小數(shù)部分的數(shù)值。不過,在程序開發(fā)過程中,整數(shù)的使用方式還是有點復雜的,先從整數(shù)的直接量說起。

生活中使用的數(shù)字都是十進制數(shù),在Java代碼中,默認情況下也使用十進制數(shù),如0,1,2,…不過,在Java代碼中還可以使用其他進制,如:

□ 整數(shù)以0開頭時定義為八進制數(shù),如020表示十進制數(shù)16。

□ 整數(shù)以0x開頭時定義為十六進制數(shù),如0xF表示十進制數(shù)15。

□ 整數(shù)以0b開頭時定義為二進制數(shù),如0b0101表示十進制數(shù)5。

下面的代碼可以驗證這些數(shù)的值。

此外,還需要注意,如果沒有指定類型,整數(shù)默認為int類型。

2.5.1 算術運算

加、減、乘、除、取余數(shù),這些概念并不陌生。軟件開發(fā)中,它們同樣是基本的數(shù)據運算方式。Java代碼中分別使用如下運算符。

□ +,加法運算符,如x+y。

□ -,減法運算符,如x-y。

□ *,乘法運算符,如x*y。

□ /,除法運算符,如x/y。

□ %,取余數(shù)運算符,也稱為取模運算符,如x % y。

整數(shù)運算時,應注意以下一些問題。

□ 整數(shù)運算的結果依然是整數(shù),如果運算數(shù)的類型不一樣,則統(tǒng)一轉換為取值范圍較大的類型,然后進行計算。

□ 整數(shù)的除數(shù)運算結果中只保留整數(shù)部分。

□ 整數(shù)的除法和取余數(shù)運算時,如果右運算數(shù)為0,即x/y或x%y中的y為0時,會產生錯誤。

下面的代碼演示了整數(shù)的算術運算。

2.5.2 增量與減量運算

簡單地說,增量運算負責執(zhí)行變量加1的操作。增量運算又分為前增量和后增量,都使用++運算符。下面分別討論二者。

首先介紹前增量,先看一下代碼的執(zhí)行結果。

第一個輸出語句顯示的是前增量運算表達式的值,第二個輸出語句顯示的則是前增量運算后x變量的值。

前增量時,會先執(zhí)行變量加1的操作,然后返回增量表達式的值,所以,++x表達式顯示的值是2。

后增量時,增量表達式會先返回x的值,然后進行加1的操作,如下面的代碼所示。

執(zhí)行代碼后,可以看到,x++表達式首先返回x的值,然后執(zhí)行加1的操作,最終x的值同樣為2。

對于前增量和后增量操作,如果只需要使用變量運算后的值,則它們的結果是一樣的,但在使用運算表達式的值時,就需要注意它們的區(qū)別了。

此外,減量和增量運算類似,只是減量執(zhí)行減1的操作。應用時,也需要注意前減量運算和后減量運算的區(qū)別。

2.5.3 位運算

位運算主要包括邏輯位運算和位移運算。其中,邏輯位運算會對操作數(shù)的二進制位進行邏輯運算,包括:

□ 位“與”運算,使用&運算符,當兩個二進制位數(shù)據都為1時返回1,否則返回0。

□ 位“或”運算,使用|運算符,當兩個二進制位數(shù)據有一個為1時返回1,否則返回0。

□ 位“取反”運算,使用~運算符,當二進制位數(shù)據為1時返回0,為0值時返回1。

□ 位“異或”運算,使用^運算符,當兩個二進制位數(shù)據相同時返回0,不同時返回1。

下面的代碼演示了邏輯位運算的應用。

本例中定義了兩個byte類型的變量,并賦給它們8位二進制數(shù)。與(&)、或(|)、異或(^)運算的結果都能容易計算出來,就是把二進制數(shù)轉換為十進制數(shù)的方法,如x|y的結果,其計算方法就是:

那么,對于x取反(~)操作的結果0b11111101怎么會顯示-3呢?byte類型的數(shù)據是有符號的,即最高位是符號位,1表示負數(shù),0表示0或正數(shù)。此外,當數(shù)據為負數(shù)時,其二進制實際上是其絕對值的補碼形式。

整數(shù)3的8位二進制形式是00000011,其補碼的計算是按位取反后加1,即11111100+1,也就是11111101,表示-3。

實際開發(fā)工作中,邏輯位運算經常進行一些標識數(shù)據的比較工作,如下面的代碼所示。

代碼中,首先定義三個基本的標識數(shù)據,即flag1、flag2和flag3。它們的特點是在不同的二進制位的數(shù)據是1,其他位都是0。然后定義了flagA變量,設置其為flag1和flag2的組合(使用或運算)。

接下來,分別將flagA與flag1、flag3對比(使用與運算)。當flagA包括指定的標識數(shù)據時,就會返回這個標識數(shù)據,否則返回0。這樣就可以通過位運算非常高效地進行數(shù)據的對比工作。

另一種二進制位的運算是位移運算,在Java中包括三個位移運算符,即<<運算符、>>運算符和>>>運算符。下面分別討論三者。

<<運算符稱為位左移運算,執(zhí)行此運算時,二進制位會向左移動,低位補0,如下面的代碼所示。

    System.out.println(0b0010 << 2);        // 8, 0b1000

二進制數(shù)0010表示2,左移兩位就是1000,即數(shù)字8。實際上,當整數(shù)x進行左移n位運算時,就是在執(zhí)行x * 2n的運算。

請注意,如果位左移操作超過類型所支持的位數(shù),超出部分就會丟失,也就是發(fā)生了數(shù)據溢出,如下面的代碼所示。

    System.out.println((byte)(0b11000001<< 1));     // -126

代碼中的-126是怎么得到的呢?首先,計算11000000左移1位的操作,其結果是110000010,如果是int類型,它就是386。但是,如果將數(shù)據強制轉換為byte類型,而byte只能保存8位整數(shù),那么最高位的一個1會丟失,結果變?yōu)?0000010。對于byte類型的數(shù)據,其最高位為符號位,所以這是一個負數(shù),但它是數(shù)值絕對值的補碼,需要反推計算。首先,減1得到10000001。然后,取反得到01111110。接下來,通過如下算式計算其十進制數(shù)據。

    26+25+24+23+22+21 = 64+32+16+8+4+2 = 126

這樣,byte類型的二進制10000010表示的就是-126。

>>運算符稱為有符號位右移運算符,執(zhí)行此操作時,二進制位會向右移動,此時,符號位不動,右移空出的高位要補上與符號位相同的數(shù)據。下面的代碼用于右移一個正整數(shù)。

    System.out.println((byte)0b01000000 >> 2);     // 16

當01000000右移兩位時,其結果為00010000,即正整數(shù)16。實際上,執(zhí)行x>>n運算時,就是在計算x/2n。下面的代碼對負整數(shù)執(zhí)行>>運算。

    System.out.println((byte)0b11000000 >> 2);     // -16

11000000表示一個負數(shù),通過反推計算(減1取反)可以得出,它表示-64。進行右移兩位運算時,其結果就是11110000,再進行減1取反得到00010000,也就是16。這樣也就驗證了代碼中的計算結果。

>>>運算符稱為無符號右移運算,執(zhí)行此運算時,不考慮符號位,數(shù)據整體右移,并在高位補0,如下面的代碼所示。

    System.out.println(0b11000000 >>> 2);        // 48

當11000000右移兩位時,其結果為00110000,也就是48。

本節(jié)已經使用了+、-、*、/、%、&、|、^、<<、>>、>>>等運算符,這些運算符可以與賦值運算符=組合使用,如x += 2的含義就是x = x + 2,其他運算符的組合也有類似的功能。

主站蜘蛛池模板: 察雅县| 北川| 南投市| 保康县| 安吉县| 隆安县| 抚州市| 泾源县| 从化市| 青州市| 黔东| 得荣县| 宁武县| 汽车| 华安县| 庐江县| 长丰县| 南康市| 北海市| 建德市| 历史| 西乌珠穆沁旗| 盐城市| 白朗县| 抚远县| 峡江县| 长子县| 南涧| 历史| 万载县| 井研县| 高邑县| 永和县| 靖江市| 永泰县| 双流县| 昌宁县| 肇州县| 喀喇沁旗| 三江| 太原市|