你所不太了解的位運算

2021-10-24 21:09:22 字數 1756 閱讀 8038

與、或、非、異或這些運算子的含義就不過多介紹了,本篇文章主要通過乙個例題來介紹如何靈活使用位運算子,來給我們的演算法錦上添花。例題如下:

演算法**如下

class

solution

return ones;

}}

解題思路如下圖所示、考慮數字的二進位制形式,對於出現三次的數字,各二進位制位出現的次數都是3的倍數。因此統計所有數字的各二進位制位中1的出現次數,並對3求餘,結果則為只出現一次的數字。

各二進位制位的位運算規則相同,因此只需要考慮一位即可。如下圖所示,對於所有數字中的某二進位制位1的個數,存在3種狀態,即對3餘數為0,1,2。

如下圖所示,由於二進位制只能表示0,1,因此需要使用兩個二進位制位來表示3個狀態。設此兩位分別為two,one,則狀態轉換變為:

接下來,需要通過狀態轉換表匯出狀態轉換的計算公式。首先回憶一下位運算特點,對於任意二進位制位x,有:

異或運算:x^

0=x,x^1=

~x與運算:x&0=

0,x&

1=x

計算one方法:設當前狀態為two one,此時輸入二進位制位n。如下圖所示,通過對狀態表的情況拆分,可推出one的計算方法為:

if

(two==0)

引入異或運算,可將以上拆分化簡為:

if

(two==0)

one=one^n;

if(two==1)

one=

0;

引入與運算,可繼續簡化為:

計算two方法:由於是先計算one,因此應在新one的基礎上計算two。如下圖所示,修改為新one後,得到了新的狀態圖。觀察發現,可以使用同樣的方法計算two,即:

返回值:以上是對數字的二進位制中「一位」的分析,而int型別的其他31位具有相同的運算規則,因此可將以上公式直接套用在32位數上。遍歷完所有數字後,各二進位制位都處於狀態00和狀態01(取決於「只出現一次的數字」的各二進位制位是1還是0),而此兩狀態是由one來記錄的(此兩狀態下twos恒為0),因此返回ones即可

複雜度分析:

CSS中你不太了解的細節 (三)

relative 元素開啟相對定位 如果不設定偏移量元素不會發生任何的變化,當元素開啟了定位以後,可以通過偏移量來設定元素的位置。top,bottom,left,right 設定後它的位置只會影響自己,不會影響別人,不存在把別的塊元素擠下去。相對定位是參照於元素在文件流中的位置進行定位的。相對定位會...

不為你所了解的諾基亞

公司型別public omx nok1v nyse nok stockholmsborsen noki frankfurter wertpapierborse noa3 成立時間芬蘭諾基亞 1865年 總部地點芬蘭埃斯波 重要人物fredrik idestam,founder jorma ollil...

你所了解的設計模式

定義 示例 singletonpattern 單例模式的特點 1 私有的構造方法 2 私有的靜態的變數 3 自定義的例項化的方法 public class singleton 要素2 靜態私有成員變數 private static singleton objinstance 要素3 public s...