一個不讓用加號的需求而引發的Java位運算詳解

piny發表於2021-09-09

起因

  • 刷題碰到的問題,給定兩個int型別的整數,然後不使用+計算兩個數的和

  • 不使用加號,就只能使用位運算子了,所以趁著機會徹底摟清楚位運算子的用法了

基礎的程式碼實現##

/**
 * @param a: An integer
 * @param b: An integer
 * @return: The sum of a and b
 */public static int aplusb(int a, int b) {   if(b == 0 )       return a;   int sum = a^b;   int carry = (a&b)<<1;   return aplusb(sum,carry);
}

十進位制轉二進位制

原理

  • 給定的數迴圈除以2,直到商為0或者1為止。將每一步除的結果的餘數記錄下來,然後反過來就得到相應的二進位制了

  • 比如8轉二進位制,第一次除以2等於4(餘數0),第二次除以2等於2(餘數0),第三次除以2等於1(餘數0),最後餘數1,得到的餘數依次是0 0 0 1

  • 反過來就是1000,計算機內部表示數的位元組長度是固定的,比如8位,16位,32位

  • 所以在高位補齊,java中位元組碼是8位的,所以高位補齊就是00001000

  • 寫法為(8)10=(00001000)2

程式碼實現

 public class mapHashCodeTest {
     public static void main(String[] args) {
     String str = toBinary(8);
     System.out.println(str);
 } 
 static String toBinary(int num) {
    String str = "";    while (num != 0) {
     str = num % 2 + str;
     num = num / 2;
        }    return str;
    }
 }

二進位制轉十進位制

原理

  • 比如8的二進位制表示位00001000,去掉補齊的高位就是1000

  • 此時從個位開始計算2的冪(個位是0,依次往後推)乘以對應位數上的數,然後得到的值想加

  • 於是有了,(2的0次冪)0+(2的1次冪)0+(2的2次冪)0+(2的3次冪)1 = 8

  • 程式碼實現,直接呼叫Integer.parseInt("",2);

  • System.out.println(Integer.parseInt("1000",2));

  • 執行結果:8

位<<異或>>運算(^)

運算規則

  • 兩個數轉為二進位制,然後從高位開始比較

  • 如果相同則為0,不相同則為1

  • 比如:8^11.

  • 8轉為二進位制是1000,11轉為二進位制是1011.從高位開始比較得到的是:0011.然後二進位制轉為十進位制,就是Integer.parseInt("0011",2)=3;

位<<與>>運算子(&)

運算規則

  • 兩個數都轉為二進位制,然後從高位開始比較

  • 如果兩個數都為1則為1,否則為0

例子

  • 比如:129&128.

  • 129轉換成二進位制就是10000001,128轉換成二進位制就是10000000。從高位開始比較得到,得到10000000,即128.

位<<或>>運算子(|)

運算規則

  • 兩個數都轉為二進位制,然後從高位開始比較

  • 兩個數只要有一個為1則為1,否則就為0

例子

  • 比如:129|128.

  • 129轉換成二進位制就是10000001,128轉換成二進位制就是10000000。從高位開始比較得到,得到10000001,即129.

位<<非>>運算子(~)

運算規則

  • 如果位為0,結果是1,如果位為1,結果是0.

  • 比如:~7,對7的二進位制進行取反

  • 7轉為二進位制是111

  • 原碼為:00000000 00000000 00000000 00000111

  • 反碼為:11111111 11111111 11111111 11111000

  • 所以~7的結果為-8

Java中負數的表示##

  • ~7補碼反碼加一即為(-8+1)為:11111111 11111111 11111111 11111001

  • -7在計算機內部就表示為7的補碼

  • 透過-7的二進位制碼計算7的二進位制表示

  • 減一為:11111111 11111111 11111111 11111000

  • 取反為:00000000 00000000 00000000 00000111



作者:天下無敵強
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2818362/,如需轉載,請註明出處,否則將追究法律責任。

相關文章