利用位移法進行除法運算

幽鳴鹿發表於2020-12-09

位移符號:

<<

左移運算子

例如:23<<2

將23轉化為二進位制,並以此向左移動2個bit,新增的低位補0

binary:0001 0111

位移後:01 011100

通俗的也可以理解為:

例如 a << b

結果就是:a*2^b(a乘以2的b次方)

 

>>

右移運算子

例如:23>>2

將23轉換為二進位制,並以此向右移動2個bit,如果為負數則在高位補1若為正數則在高位補0

binary:0001 0111

位移後:0000 0101

同樣通俗的也可以理解為:

例如 a>>b

結果為:a%2^b (a除以2的b次方取整)

 

>>>

無符號右移

無論正數還是負數,均向右移動並在高位補0

當時正數時,他的作用和右移運算子基本相同

負數時差距較大

 

補充一下:

也是和二進位制計算有關的一個運算子

^

位異或運算子

例如:20^10

Binary:20  0001 0100

    10  0000 1010

按照XOR邏輯每一位以此進行計算

XOR:A XOR B = F

True Table

A  B  F

0  0  0

1  0   1

0  1   1

1   1  0

結果:

Binary: 0001 1110 = 30

 

下面是利用位移法進行除法運算


class Solution {
    public int divide(int dividend, int divisor) {
       if(dividend == 0){return 0;}
       if (dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        }
       boolean negative;
       negative =(dividend^divisor)<0;//用異或來計算是否符號相異
       long a = Math.abs((long)dividend);
       long b = Math.abs((long)divisor);
       int result = 0;
       for(int i=31;i>=0;i--){
           if((a>>i)>=b){//找出足夠大的數2^n*divisor
               result+=1<<i;//將結果加上2^n
               a-=b<<i;//將被除數減去2^n*divisor
           }
       }
       return negative? -result : result;//符號相異取反
    }
}
 

 

相關文章