利用位移法进行除法运算

位移符号:

<<

左移运算符

例如: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;//符号相异取反
    }
}
 

 

posted @ 2020-12-09 22:48  不想努力的小白同学  阅读(1313)  评论(1编辑  收藏  举报