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

3.3.2 移位運算

移位運算按照規則將二進制數的每一位向左或向右移動,從而改變數值大小。Java語言提供了3個移位運算的運算符,即移位運算符,如表3.9所示。

表3.9 移位運算符

1.左移運算

左移運算使用左移運算符(<<)將二進制數的每一位向左移動指定位數。使用左移運算符構建的表達式被稱為左移運算表達式。其語法形式如下:

左移運算表達式需要兩個操作數,因此左移運算符是二元運算符(雙目運算符)。左移分為無符號整型左移和有符號整型左移。下面將詳細講解這兩種左移方式。

(1)無符號整型左移:將一個二進制數的每一位向左移動指定的位數,其中左邊被移出整型存儲邊界的位直接拋棄,右邊空白的位用0填補。如圖3.20所示為無符號整型二進制數00001111左移4位的過程。

圖3.20 無符號整型左移

注意:左移1位的效果相當于將一個整數乘以一個因子為2的整數。向左移動一個整數的比特位相當于將這個數乘以2。以下算式展示的就是將整數15的位向左移動4位的結果。

示例3-25】下面將二進制數00001111向左移動4位。代碼如下:

運行結果如下:

(2)有符號整型左移:有符號整型通過二進制位的第一位來表示,第一位為0表示正數,為1表示負數。其余的位(稱為數值位)用來存儲實值。有符號正數和無符號正數在計算機中存儲的結果是一樣的。如圖3.21所示為+4的二進制存儲。

圖3.21 +4的二進制存儲

負數的存儲(二進制存儲)比較復雜,這里需要有一個運算,即2的n次方減去負數的絕對值,其中n為數值位的位數。例如-4,它以byte類型存儲時有7位數值位,所以它的二進制存儲等同于

再將124轉化為二進制數,就是-4的二進制存儲,如圖3.22所示。

圖3.22 -4的二進制存儲

除了可以使用2的n次方減去負數的絕對值這個方法計算負數的二進制存儲外,還可以使用取反加1的方法(補碼)實現負數的二進制存儲。還是以-4為例,首先,獲取4的原碼,即00000100,然后進行取反,如圖3.23所示。

圖3.23 原碼取反

最后將取反的值加1,如圖3.24所示。

圖3.24 取反值加1

得到的11111100為-4的二進制存儲。了解了正數和負數的表示后,再來看有符號整型左移,對于一個正數來說,其左移就是無符號整型左移,對于一個負數來說,后面的運算一樣,即左移1位乘以2。

示例3-26】下面將-4向左移動1位。代碼如下:

運行結果如下:

2.右移運算

右移運算使用右移運算符(>>)將二進制數的每一位向右移動指定位數。使用右移運算符構建的表達式被稱為右移運算表達式。其語法形式如下:

右移運算表達式需要兩個操作數,因此右移運算符是二元運算符(雙目運算符)。右移分為無符號整型右移和有符號整型右移。下面將詳細講解這兩種右移方式。

(1)無符號整型右移:將一個二進制數的每一位向右移動指定的位數,其中右邊被移出整型存儲邊界的位直接拋棄,左邊空白的位用0填補。如圖3.25所示為無符號整型二進制數00001111右移2位的過程。

圖3.25 無符號整型右移

注意:右移1位的效果相當于將一個整數除以一個因子為2的整數。向右移動一個整數的比特位相當于將這個數除以2。以下算式展示的就是將整數15的位向右移動2位的結果:

示例3-27】下面將15右移2位。代碼如下:

運行結果如下:

(2)有符號整型右移:如果是正數,其右移和無符號整型右移是一樣的,但是對于負數來說是有分別的,它需要使用符號位去填充空白位。如圖3.26所示為將-4向右移動1位的操作。

圖3.26 有符號整型右移

示例3-28】下面將-4右移1位。代碼如下:

運行結果如下:

3.邏輯右移運算

邏輯右移運算需要使用邏輯右移運算符(>>>)。使用邏輯右移運算符構建的表達式被稱為邏輯右移運算表達式。其語法形式如下:

邏輯右移運算符需要兩個操作數,因此它是二元運算符(雙目運算符)。邏輯右移是無符號右移,忽略符號位,空位都以0補齊。

示例3-29】下面將15邏輯右移2位。代碼如下:

運行結果如下:

主站蜘蛛池模板: 建湖县| 棋牌| 靖边县| 东海县| 贡嘎县| 定襄县| 聊城市| 平南县| 宁安市| 隆子县| 墨竹工卡县| 罗定市| 潍坊市| 东平县| 门头沟区| 中牟县| 永城市| 洛扎县| 剑阁县| 疏附县| 呼伦贝尔市| 辽中县| 清丰县| 克拉玛依市| 朝阳市| 杭州市| 清丰县| 商都县| 腾冲县| 广元市| 上思县| 白银市| 茂名市| 贵港市| 衡阳市| 蓝田县| 拜城县| 嘉义市| 曲周县| 庐江县| 靖宇县|