java位運算和無符號運算
計算機在底層使用的是二進制補碼進行運算。
計算規則:
正數的原碼、反碼、補碼是其二進制本身。
負數的原碼首先計算其二進制數,然後最高位使用1表示負數,反碼是最高位不變其它位取反,補碼是在反碼的基礎上進行+1操作。
System.out.println( 8 >> 1);//正數進行右移位運算
8的二進制是 0000 0000 0000 0000 0000 0000 0000 1000,進行右移1位得到二進制0000 0000 0000 0000 0000 0000 0000 0100,然後轉成二進制是4
以此類推
/* 1000
* 0100 4 右移1位
* 0010 2 右移2位
* 0001 1 右移3位
* 0000 0 右移4位
* */
System.out.println( -8 >> 1);//負數進行右移位運算 (右移高位補1)
-8的二進制是1000 0000 0000 0000 0000 0000 0000 1000,這裏最高位1表示是負數
/*
* 1000 0000 0000 0000 0000 0000 0000 1000 原碼
* 1111 1111 1111 1111 1111 1111 1111 0111 反碼
* 1
* 1111 1111 1111 1111 1111 1111 1111 1000 補碼
* 1 1111 1111 1111 1111 1111 1111 1111 100 位運算得到的是補碼然後轉到原碼
* 1 0000 0000 0000 0000 0000 0000 0000 011
* 1
* 1 0000 0000 0000 0000 0000 0000 0000 100 -4 原碼
* */
System.out.println(8<<2);//正數進行左移位運算
/*
* 0000 0000 0000 0000 0000 0000 0000 1000 原碼
* 0000 0000 0000 0000 0000 0000 0010 0000 位運算 32
*/
System.out.println(-8<<2);//負數進行左移位運算(左移地位補0)
/* 1000 0000 0000 0000 0000 0000 0000 1000 -8的原碼
* 1111 1111 1111 1111 1111 1111 1111 0111 反碼
* 1111 1111 1111 1111 1111 1111 1111 1000 補碼
* 11 1111 1111 1111 1111 1111 1111 100000 位運算
* 10 0000 0000 0000 0000 0000 0000 011111 位運算之後補碼
* 10 0000 0000 0000 0000 0000 0000 100000 原碼
* -32
* */
System.out.println(-9>>>2);無符號運算,高位進行補0,低位舍去
/*
* 1000 0000 0000 0000 0000 0000 0000 1001 原碼
* 1111 1111 1111 1111 1111 1111 1111 0110 反碼
* 1111 1111 1111 1111 1111 1111 1111 0111 補碼
* 001111 1111 1111 1111 1111 1111 1111 01 移位 (移位得到的是正數,所以補碼就是其本身)
* */
java位運算和無符號運算