利用位移法进行除法运算
位移符号:
<<
左移运算符
例如: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;//符号相异取反
}
}