位運算的應用場景:
因為位運算的運算效率比直接對數字進行加減乘除高很多,所以當出現以下情景且對運算效率要求較高時,可以考慮使用位運算。
情況1:
輸入乙個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。例如輸入5,因為5 的二進位制表示為101,所以輸出為2.
解題思路:普通方法是將5轉換成二進位制的形式,然後再遍歷該二進位制字串,如果是1,則計數count加1
public static int tobinary(int m)
}return count;
}
如果用位運算,則
數字在記憶體中 ,被轉化為二進位制。
例如7表示為0111,
n&(n-1) 即(0111)&(0110)== 0110 就是 n去除了最後乙個1 ;
幾個1 就可以在幾次內 去除幾個1;
public class main
system.out.println(count);}}
}
情況2;
兩個int32整數m和n的二進位制表達,有多少個位(bit)不同麼? 例如輸入為1999和 2299,因為兩個的二進位制分別表示為
11111001111和
1000011111011,所以輸出為7.
思路1:是兩個數轉換成二進位制之後,位數若不相等,則短的那個前面補0,使兩個二進位制的位數相等,然後在依次判斷每一位上的數字是否相等,若相等則count加1;
public static int countbitdiff(int m, int n)
if (ms.length() > ns.length() )
diff--;
} //轉換成陣列,然後每個位進行比較
char sm = ms.tochararray();
char sn = ns.tochararray();
for (int i = 0; i < sn.length; i++)
} return count;
}
思路2: 使用
異或運算。異或運算子是用符號「^」表示的,其運算規律是:兩個運算元的位中,相同則結果為0,不同則結果為1。
將兩個數進行
異或操作後的結果轉換成二進位制形式,然後計算該二進位制有多少個1,即有多少位不同
public static int count(int m, int n)
} return count;
}
其他操作:參考
1. 判斷int型變數a是奇數還是偶數
a&1 = 0 偶數
a&1 = 1 奇數
2. 求平均值,比如有兩個int型別變數x、y,首先要求x+y的和,再除以2,但是有可能x+y的結果會超過int的最大表示範圍,所以位運算就派上用場啦。
(x&y)+((x^y)>>1);
3. 對於乙個大於0的整數,判斷它是不是2的幾次方
((x&(x-1))==0)&&(x!=0);
4. 比如有兩個int型別變數x、y,要求兩者數字交換,位運算的實現方法:效能絕對高效
x ^= y;
y ^= x;
x ^= y;
5. 求絕對值
int abs( int x )
6. 取模運算,採用位運算實現:
a % (2^n) 等價於 a & (2^n - 1)
7. 乘法運算 採用位運算實現
a * (2^n) 等價於 a << n
8. 除法運算轉化成位運算
a / (2^n) 等價於 a>> n
9. 求相反數
(~x+1)
10 a % 2 等價於 a & 1
java位操作符
無符號右移位操作符 在將bit串右移位時,從bit串的最左邊填充0,這和帶符號右移位操作符 不同。在將bit串右移位時,從bit串的最左邊填充原來最左邊的位。也就是說,bit串原來最左邊的位是符號位,如果為1,則在帶符號右移時最左邊始終填充1 如果為0,則在帶符號右移時最左邊始終填充0。移位操作符的...
理解java位操作符
最近的工作需要大量的採用位操作符的 其實專案本身沒有這樣的需求,不過現在我的職責是維護同事的 而這位同事的偏好是採用位操作,沒辦法學習了。無符號右移位操作符 在將bit串右移位時,從bit串的最左邊填充0,這和帶符號右移位操作符 不同。在將bit串右移位時,從bit串的最左邊填充原來最左邊的位。也就...
Java移位操作符以及按位操作符
按位操作符 針對兩個整數引數中的對應位執行布林代數運算,並生成乙個結果。按位與 如果兩個輸入位都是1則生成乙個輸出位1,否則生成乙個輸出位0。按位或 如果兩個輸入位只要有一位是1則生成乙個輸出位1.否則生成乙個輸出位為0。按位異或 如果兩個輸入位只有其中一位是1那麼生成輸出位1,否則生成乙個輸出位為...