- Java與Android移動應用開發(fā):技術、方法與實踐
- 曹化宇
- 1934字
- 2019-12-06 15:39:01
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,其他運算符的組合也有類似的功能。
- 自制編譯器
- Vue.js前端開發(fā)基礎與項目實戰(zhàn)
- C語言程序設計
- JavaScript by Example
- SQL Server 2012數(shù)據庫管理與開發(fā)項目教程
- Learning OpenCV 3 Computer Vision with Python(Second Edition)
- Python+Tableau數(shù)據可視化之美
- Raspberry Pi Robotic Blueprints
- Clojure for Java Developers
- Instant jQuery Boilerplate for Plugins
- Python機器學習與量化投資
- 交互設計師成長手冊:從零開始學交互
- C Primer Plus(第6版)中文版【最新修訂版】
- WCF全面解析
- Mastering Responsive Web Design