/** * 測試按位與、按位或、異或、移位、按位非 */ @Test public void testYiWei() { int i = 3; //對應二進制 ...11 int j = 2; //對應二進制 ...10 int k = -3; //對應二進制 10000000 00000000 00000000 00000011(原碼) //按位與& 從高位開始兩個都為1 為1,否則 為0 System.out.println(i & j); //10(2進制) -> 2(10進制) //按位或| 從高位開始只要1個為1 為1,否則 為0 System.out.println(i | j); //11(2進制) -> 3(10進制) //異或^= 從高位開始相同為0,否則 為1 System.out.println(i ^ j); //01(2進制) -> 1(10進制) //左移位<<1 向左移位1位,最低位補0,原來的第二高位現在成為最高位 System.out.println(i << 1); //0011 移位后 0110,對應10進制的6 //右移位>>1 向右移位1位,最高位補上符號位,且不變 /* 移位前 11111111 11111111 11111111 11111101(補碼) 移位后 11111111 11111111 11111111 11111110(補碼), 對應原碼 10000000 00000000 00000000 00000010 */ System.out.println(k >> 1); //-2(10進制) //無視符號右移位>>>1 向右移位1位,最高位補上0 /* 移位前 11111111 11111111 11111111 11111101(補碼) 移位后 01111111 11111111 11111111 11111110(補碼), 對應原碼 01111111 11111111 11111111 11111110 */ System.out.println(k >>> 1); //2147483646即2^31-1-1(10進制) /* 按位非的流程: 00000000 00000000 00000000 00000010 1.2的2進制(這里是補碼,因為是正數,所以和原碼一樣) 11111111 11111111 11111111 11111101 2.位非 11111111 11111111 11111111 11111100 3.取原碼 (-1) 10000000 00000000 00000000 00000011 3.取原碼 (取反) */ System.out.println(~j); //-3(10進制) }
這里需要知道原碼補碼反碼的一些知識,https://www.jianshu.com/p/129f9daae472(個人覺得這篇文章講得不錯)