位运算的一些技巧总结
位運算
這里主要總結(jié)一些位運算的基礎(chǔ)用法,不從位運算的運算過程展開了:
1.&(and)運算
&運算通常用于二進制取位操作,例如一個數(shù) & 1的結(jié)果就是取二進制的最末位。
基礎(chǔ)用法:
(1)可以用來判斷一個整數(shù)的奇偶,二進制的最末位為0表示該數(shù)為偶數(shù),最末位為1表示該數(shù)為奇數(shù)。
(2)x & (x-1) 用于消去 x 的最后一位 1。
(3)在運用(2)的基礎(chǔ)上可以用來判斷一個正整數(shù)是不是2的整數(shù)冪次,如果x & (x-1) 是0,說明是;如果不是0,說明不是;
2.| (or)運算
|運算通常用于二進制特定位上的無條件賦值,例如一個數(shù) | 1的結(jié)果就是把二進制最末位強行變成1。
基礎(chǔ)用法:
(1)如果需要把二進制最末位變成0,對這個數(shù)or 1之后再減一就可以了,其實際意義就是把這個數(shù)強行變成最接近的偶數(shù)。
(2)
3.^(xor)運算
^運算通常用于對二進制的特定一位進行取反操作,因為異或可以這樣定義:0和1異或0都不變,異或1則取反。
基礎(chǔ)用法:
(1) ^ 運算的逆運算是它本身,也就是說兩次異或同一個數(shù)最后結(jié)果不變,即(a ^ b) ^ b = a。
(2)一個數(shù) a^a=0;
(3)運用(1)可以延伸很多用法,比如判斷一個數(shù)組里面出現(xiàn)一次的數(shù)(其他的數(shù)出現(xiàn)兩次);
(4)是第(3)的進階,有一個 n 個元素的數(shù)組,除了兩個數(shù)只出現(xiàn)一次外,其余元素都出現(xiàn)兩次,讓你找出這兩個只出現(xiàn)一次的數(shù)分別是幾?
這道題的思路是把所有元素都異或,那么得到的結(jié)果就是那兩個只出現(xiàn)一次的元素異或的結(jié)果。然后把這個結(jié)果轉(zhuǎn)化為二進制,找到為 1 的一個位置,根據(jù)這個位置是否為1把數(shù)組里所有的元素分成兩部分;然后兩部分分別異或,得到的就是兩個只出現(xiàn)一次的數(shù);
4.這幾種常見的位運算運算性質(zhì)
(1)信息丟失
位運算中“與”、“或”會造成信息丟失,他們是單向運算,不可逆運算。
但是“異或”不會,例如:
x ^ a = y;
當a 確定時,x與y 一一對應,且
x = y ^ a;
(2)運算性質(zhì)
一般情況下,結(jié)合律和分配律是失效的,只有交換律能安全使用。
例如:
交換律:
a | b=b | a;
a ^ b=b ^ a;
a & b=b & a;
結(jié)合律:
(3|1)&2=2;
3|1&2=3;
分配律:
(4|3)^1=6;
(4 ^1 ) | ( 3 ^1)=7;
但是對于單一的位運算來說,結(jié)合律都是符合的,其實就是變?yōu)榱私粨Q律;
貼一張用法大全圖:
總結(jié)
以上是生活随笔為你收集整理的位运算的一些技巧总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源app后台开源框架集合 java
- 下一篇: Json笔记-高德地铁数据分析