位移符號:
<<
左移運算子
例如: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;//符號相異取反
}
}