java 位運算常用技巧
(1) m<<n:左移—m左移n位,最左邊n位丟棄,最右補n個0。
數乘2n:相當於數左移n位;注意,除操作慎用右移,注意負數情況。
(2) m>>n:右移—最右邊n位丟棄,最左邊0補位(無符號)/符號位補最左邊。
**利用右移對最右邊的位進行與運算,判斷數為0還是1://判斷奇數、偶數
** 0:(c&1)==0 c >>= 1;
** 1: (c&1)==1) c >>= 1;
(3) 常見位操作:
A. 獲取某位的值:
num &(1<<i) 將1左移i位與原值相與,其他位為0,可判斷i位的值。
B. 某位的值置1:
num |(1<<i) 將1左移i位與原值相或,其他位不變, i位的值置1。
C. 某位的值清0:掩碼思想
num & ~(1<<i) 將1左移i位取反與原值相與,其他位不變, i位的值清0。
num& ( (1<<i) -1) 將最高位至i位(含)清零
num & ~( ( 1<<(i+1) -1) 將i位至0位(含)清零
D. 更新:
(num & ~(1 << i)) | (v << i) //v為1則將num的i位更新為1,否則為0.
(4) &與&&
A. &&邏輯與、||邏輯或的短路特性可以代替遞迴出口判斷:
boolean b = (n!=0)&&((f +=f(n-1)) > 0 );
邏輯與(&&)前-不成立時,不進行後-的計算,從而控制n==0時不再遞迴。
B. &可用作位運算子,當&操作符兩邊的表示式不是boolean型別時,&表示按位與操作,通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位。
** 檢查n是否為2的某次方(二進位制中只有一個1):((n & (n-1))==0)
**把一個整數減去1,再與原數相與,相當於把整數二進位制最右邊一個1變成0.