計算機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...