位運算相關總結

2021-07-12 07:35:04 字數 1902 閱讀 5502

計算機cpu中alu是由邏輯門構成的,非常善於位運算。因此,在程式中使用位運算,經常能夠加快程式執行。另外,掌握一些位運算的相關知識也能增加一些程式設計的樂趣。

位運算經常使用到異或運算和與運算。異或運算符合交換律、結合律,它的特點是相同為0,不同為1。與運算是同為1則為1。

詳細內容

1、兩個數比較大小

描述:給定兩個整數a和b,用位運算比較兩個數的大小,並將較大的數返回。

分析:首先計算a和b的差值c。通過判斷c的符號來得到它們中較大的值。

示例**

public

intsig(int c)

public

intnsig(int c)

public

intgetmax1(int a, int b)

總結:直接相減可能會出現越界的問題,如何處理?

2、陣列中出現奇數次的數

描述:乙個整數陣列中有乙個數出現了奇數次,實現乙個o(n)複雜度的演算法找到這個值。

分析:利用異或運算相同則為零的性質,來找到陣列中出現奇數次的值。

示例**

public

intfindodd(int a, int n)

int ret = 0;

for (int i = 0; i < n; i++)

return ret;

}

3、找出陣列中兩個出現奇數次的數

描述:乙個整數陣列中有兩個數出現了奇數次,實現乙個o(n)複雜度的演算法找到這兩個值。返回這兩個值,並且較小的值在前。

分析:首先遍歷這個陣列,可以得到這兩個數的異或值e。設e的二進位制形式最右側1的位置表示的數為k。因為e中logk位置為1,那麼這兩個數中必有乙個數的二進位制形式在logk位置是1。有了這個性質,再遍歷這個陣列,e0只和陣列中二進位制形式logk位置為1的數做異或操作,那麼e0就是出現奇數次的數。然後e異或e0的結果就是另乙個出現奇數次的整數。

示例**

public

int findodds2(int arr, int n)

int rightone = e & (~e + 1);//快速求得右側第乙個1出現的位置

for (int cur : arr)

}int small = math.min(e0, (e ^ e0));

int big = math.max(eohasone, (eo ^ eohasone));

return

newint ;

}

4、交換兩個變數的值

描述:請編寫乙個演算法,不用任何額外變數交換兩個整數的值。 給定乙個陣列num,其中包含兩個值,請不用任何額外變數交換這兩個值,並將交換後的陣列返回。

分析

a』=a^b;

b』=a』^b=a^b^b=a;

a』=a』^b』=a^b^a^b^b=b;

示例**

public

int getswap(int num)

num[0] = num[0] ^ num[1];

num[1] = num[0] ^ num[1];

num[0] = num[0] ^ num[1];

return num;

}

位運算相關總結

按位與運算子 參加運算的兩個資料,按二進位制位進行 與 運算 運算規則 兩位同時為1結果才為 1,否則為 0.負數按補碼形式參加按位與運算 與運算 的特殊用途 1 清零。如果想將乙個單元清零,即使其全部二進位制位為0,只要與乙個各位都為 0的數值相與,結果為 0.2 取乙個數中指定位 方法 找乙個數...

C語言 位運算相關總結

1.位運算符號 取反,不分正負數 標準規定在右邊補0 正數則左邊補0,負數標準沒有規定在左邊補充的數字,分為邏輯右移和算術右移,具體由編譯器決定,windows平台和gcc採取算術右移即負數補1 2.常見的二進位制位的變換操作 去掉最後一位 101101 10110 x 1 在最後加乙個0 1011...

位運算相關題目

面試中會遇到很多與位運算相關的題目,在這裡對位運算的相關知識點和遇到的一些題目總結一下。二進位制的5種位運算 與 或 異或 左移 m 右移 m n表示 把m右移n位 最右邊的n為會被丟棄,如果數值原來是個正數,用0補上最左邊的n位,如果是乙個負數,則最左邊補上n個1 題型一 進製轉換 微軟產品exc...