思考題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位的值有意義