Java移位運算符

一 描述

  1. <<:左移運算符,左移幾位就補幾個0;
  2. >>:右移運算符(算術右移),若是數字爲正數時,移位後在前面補0,爲負數時,則在前面補1;
  3. >>>:無符號右移運算符(邏輯右移),忽略符號,空位補0便可。

二 Demo分析

/**
 * @Program: 
 * @Description: Java移位運算符Demo
 * @Author: <a href="http://heykin.xyz">heykin</a>
 * @Create: 2019-01-05 14:29
 * @Since: 1.0
 **/
public class Test {

    public static void main(String[] args) {
        /** 正數演示 **/
        System.out.println("-----------------正數演示-----------------");
        int num = 7;
        System.out.println("原值(十進制):" + num + ";原值(二進制)" + Integer.toBinaryString(num));
        int tmp = num >> 1;
        System.out.println("右移1位(十進制):" + tmp + ";右移1位(二進制)" + Integer.toBinaryString(tmp));

        tmp = num >>> 1;
        System.out.println("無符號右移1位(十進制):" + tmp + ";無符號1位(二進制)" + Integer.toBinaryString(tmp));

        tmp = num << 1;
        System.out.println("左移1位(十進制):" + tmp + ";左移1位(二進制)" + Integer.toBinaryString(tmp));
        /** 正數演示 **/

        /** 負數演示 **/
        System.out.println("-----------------負數演示-----------------");
        num = -7;
        System.out.println("原值(十進制):" + num + ";原值(二進制)" + Integer.toBinaryString(num));
        tmp = num >> 1;
        System.out.println("右移1位(十進制):" + tmp + ";右移1位(二進制)" + Integer.toBinaryString(tmp));

        tmp = num >>> 1;
        System.out.println("無符號右移1位(十進制):" + tmp + ";無符號1位(二進制)" + Integer.toBinaryString(tmp));

        tmp = num << 1;
        System.out.println("左移1位(十進制):" + tmp + ";左移1位(二進制)" + Integer.toBinaryString(tmp));
        /** 負數演示 **/
    }

}
複製代碼

運行結果:bash

對輸出結果補0對齊一下spa

正數  7
00000000 00000000 00000000 00000111  原值   
00000000 00000000 00000000 00000011  右移1位
00000000 00000000 00000000 00000011  無符號右移1位
00000000 00000000 00000000 00001110  左移1位
負數 -7(負數爲正數的補碼=正數的反碼+1)
11111111 11111111 11111111 11111001  原值
11111111 11111111 11111111 11111100  右移1位
01111111 11111111 11111111 11111100  無符號右移1位
11111111 11111111 11111111 11110010  左移1位
複製代碼

能夠看出,當要移位的數是正數時,右移和無符號右移的值是同樣的,當移位的數是負數時,右移的後的值仍是負數,無符號右移後的值則是正數。code

另外在網上看到一個快速算出移位運算符結果的方法:cdn

在不大於自身數值類型最大位數的移位時,一個數左移n位,就是將這個數乘以2的n次冪;一個數右移n位,就是將這個數除2的n次冪,而後取整。blog

好比int32位的(64位也是一樣方法):ip

7 >> 1 = 7/2 取整爲3string

7<< 1 = 7*2 爲14it

若是移動位數超過了32位怎麼辦?把移位數和32取餘數獲得的數字套用便可:io

如9 >> 67class

一、先67對32取餘,結果是3

二、而後9/8 獲得結果爲1

相關文章
相關標籤/搜索