Java二進制位運算、移位運算>>、<<、>>>

Java二進制位運算、移位運算

思考題java

一、請看下面的代碼段,回答a,b,c,d,e結果是多少?spa

public static void main(String []args){
int a=1>>2;
int b=-1>>2;
int c=1<<2;
int d=-1<<2;
int e=3>>>2;
//a,b,c,d,e結果是多少
System.out.println("a="+a);//a=0
System.out.println("b="+b);//b=-1
System.out.println("c="+c);//c=4
System.out.println("d="+d);//d=-4
System.out.println("e="+e);//e=0
}

注:">>"表明算術右移,"<<"表明算術左移,">>>"表明邏輯右移code

二、請回答在java中,下面的表達式運算的結果是:it

~2=?//-3
2&3=? //2
2|3=? //3
~-5=? //4
13&7=? //5
5|4=? //5
-3^3=? //-2

注:"~"表明位取反,"&"表明位與,"|"表明位或,"^"表明位異或class

二進制基本概念

二進制是逢2進位的進位制,0、1是基本算符。擴展

現代的電子計算機技術所有采用的是二進制,由於它只使用0、1兩個數字符號,很是簡單方便,易於用電子方式實現。計算機內部處理的信息,都是採用二進制數來表示的。二進制(Binary)數用0和1兩個數字及其組合來表示任何數。進位規則是「逢2進1」,數字1在不一樣的位上表明不一樣的值,按從右至左的次序,這個值以二倍遞增。二進制

注:1個字節=8位bit技術

bit最高位是符號位如:■□□□□□□□黑色方框爲符號位。總結

符號位0表明正數,1表明負數demo

 

二進制原碼、反碼、補碼

對於有符號的而言:

一、二進制的最高位是符號位:0表示正數,1表示負數

二、正數的原碼、反碼、補碼都同樣

三、負數的反碼=它的原碼符號位不變,其它位取反

四、負數的補碼=它的反碼+1

五、0的反碼,補碼都是0

六、java沒有無符號數,換言之,java中的數都是有符號的

七、在計算機運算的時候,都是以補碼的方式來運算的。

位運算符和移位運算

java中有4個位運算,分別是按位與&、按位或|、按位異或^,按位取反~,它們的運算規則是:

按位與&:兩位全爲1,結果爲1

按位或|:兩位有一個爲1,結果爲1

按位異或^:兩位一個爲0,一個爲1,結果爲1

按位取反:0->1,1->0

 

java中有3個移位運算符:

>>、<<算術右移和算術左移,運算規則:

算術右移:低位溢出,符號位不變,並用符號位補溢出的高位

算術左移:符號位不變,低位補0

>>>邏輯右移,運算規則是:低們溢出,高位補0

 

 

計算過程舉例

注意:計算機運算的時候,都是以補碼的方式來運算的,若是補碼計算結果負數,則須要把補碼轉爲原碼

1>>2

1的原碼

00000000 00000000 00000000 00000001

由於正數的原碼、反碼、補碼都同樣

因此1的補碼

00000000 00000000 00000000 00000001

算數右移2位結果

00000000 00000000 00000000 00000000

因此1>>2=0

推導出1>>n(n>1的正整數) 結果都爲0

-1>>2

-1的原碼

10000000 00000000 00000000 00000001

-1的反碼

11111111 11111111 11111111 11111110

-1的補碼

11111111 11111111 11111111 11111111

算數右移2位結果

11111111 11111111 11111111 11111111

補碼->反碼 :-1

11111111 11111111 11111111 11111110

反碼->原碼

10000000 00000000 00000000 00000001

因此-1>>2=-1

推導出-1>>n(n>1的正整數) 結果都爲-1

 

3>>>2

3的原碼

00000000 00000000 00000000 00000011

由於正數的原碼、反碼、補碼都同樣

因此3的補碼

00000000 00000000 00000000 00000011

 

>>>邏輯右移2位結果爲

00000000 00000000 00000000 00000000

因此3>>>2=0

~2

2的原碼補碼相同

2的補碼

00000000 00000000 00000000 00000010

按位取反~

11111111 11111111 11111111 11111101

由於第1爲是1,爲負數,因此要-1,其它位取反得原碼結果

-1

11111111 11111111 11111111 11111100

其它位取反

10000000 00000000 00000000 00000011

因此結果爲-3

總結

<< : 左移運算符,num << 1,至關於num乘以2

>> : 右移運算符,num >> 1,至關於num除以2

>>> : 無符號右移,忽略符號位,空位都以0補齊

下面來看看這些移位運算都是怎樣使用的:

public class Test { 
     public static void main(String[] args) {
         int number = 10;
         //原始數二進制
         printInfo(number);
         number = number << 1;
         //左移一位
         printInfo(number);
         number = number >> 1;
         //右移一位
         printInfo(number);
     }
     
     /**
      * 輸出一個int的二進制數
      * @param num
      */
     private static void printInfo(int num){
         System.out.println(Integer.toBinaryString(num));
     }
}

運行結果爲:

1010
10100
1010

咱們把上面的結果對齊一下:

43210      位數--------
 1010      十進制:10     原始數         number
10100      十進制:20     左移一位       number = number << 1;
 1010      十進制:10     右移一位       number = number >> 1;

看了上面的demo,如今是否是對左移和右移瞭解了不少了呢

對於:>>>

無符號右移,忽略符號位,空位都以0補齊

value >>> num -- num 指定要移位值value 移動的位數。

無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位 無符號右移運算符>>> 只是對32位和64位的值有意義

相關文章
相關標籤/搜索