/**
* @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