位运算各种方法总结
位運(yùn)算
- 1、按位與
- 2、按位或
- 3、按位取反
- 4、按位異或
- 5、按位同或
- 6、左移
- 7、帶符號右移
- 8、無符號右移
- 9、python實(shí)現(xiàn)各種位運(yùn)算操作
- 10、位運(yùn)算小技巧
- 11、應(yīng)用
\quad \quad現(xiàn)代計(jì)算機(jī)中,幾乎都是二進(jìn)制計(jì)算機(jī)(三進(jìn)制計(jì)算機(jī)僅有少量),所有的數(shù)據(jù)都以二進(jìn)制的形式存儲在設(shè)備中。位運(yùn)算就是直接對整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作,計(jì)算時將十進(jìn)制轉(zhuǎn)為 二進(jìn)制,再進(jìn)行計(jì)算。
\quad \quad需要注意,位運(yùn)算是針對 二進(jìn)制 的運(yùn)算,對每一個位進(jìn)行布爾運(yùn)算操作。所以 手動 進(jìn)行 位運(yùn)算計(jì)算 時,需要將數(shù)轉(zhuǎn)換成二進(jìn)制的表示形式,再進(jìn)行計(jì)算。
1、按位與
\quad \quad計(jì)算時將 十進(jìn)制 轉(zhuǎn)為 二進(jìn)制 再進(jìn)行計(jì)算,同位置為1,則結(jié)果為1,其余情況皆為0
- 結(jié)論:n&(n-1) 會去除 n 的位級表示中最低的那一位 1。
- 應(yīng)用例題:二進(jìn)制中1的個數(shù)
2、按位或
\quad \quad對應(yīng)位上有一個為1,結(jié)果就為1。兩個都為0,結(jié)果才得0,類似加的關(guān)系。
3、按位取反
\quad \quad對每一位進(jìn)行取反操作,如果是1則結(jié)果為0,是0則結(jié)果為1。即為反碼
4、按位異或
\quad \quad當(dāng)兩個對應(yīng)位不同時結(jié)果才為1,相同時得0.
性質(zhì):
-
任何數(shù)和 0做異或運(yùn)算,結(jié)果仍然是原來的數(shù),即a⊕0=a。
-
任何數(shù)和其自身做異或運(yùn)算,結(jié)果是 0,即 a⊕a=0。
- 異或運(yùn)算滿足交換律和結(jié)合律,a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
5、按位同或
\quad \quad當(dāng)兩個對應(yīng)位相同時結(jié)果才為1,不同時得0.
6、左移
\quad \quad將二進(jìn)制位上的數(shù)向左移動,右邊補(bǔ)0.
7、帶符號右移
\quad \quad有符號整數(shù)最高位代表著數(shù)的正負(fù),最高位為1代表負(fù)數(shù),最高位為0代表正數(shù)。
\quad \quad帶符號右移是右移時,左邊補(bǔ)充最高位上的值。
8、無符號右移
\quad \quad二進(jìn)制上的數(shù)向右移動,右移時左邊補(bǔ)0。
9、python實(shí)現(xiàn)各種位運(yùn)算操作
| & | 按位與 | a&b |
| | | 按位或 | a|b |
| ~ | 按位取反 | ~a |
| ^ | 按位異或 | a^b |
| << | 按位左移 | a<<b |
| >> | 按位右移 | a>>b |
| - | 轉(zhuǎn)換為負(fù)數(shù) | -a |
10、位運(yùn)算小技巧
1、獲取二進(jìn)制中最右邊的1,且其它位置為0: X & (-X)
因此,x 和 ?x 只有一個共同點(diǎn):最右邊的 1。這說明 x & (-x) 將保留最右邊的 1。并將其他的位設(shè)置為 0。
2、將二進(jìn)制中最右邊的1置為0: X & (X - 1)
-
(x - 1) 代表了將 x 最右邊的 1 設(shè)置為 0,并且將較低位設(shè)置為 1。
-
再使用與運(yùn)算:則 x 最右邊的 1 和就會被設(shè)置為 0,因?yàn)?1 & 0 = 0。
11、應(yīng)用
Leetcode之位運(yùn)算
總結(jié)
- 上一篇: android 获取微信二维码 Diff
- 下一篇: 项目管理10大知识领域及5大过程