使用位操作

2021-09-07 02:27:29 字數 943 閱讀 6348

見朋友出了問題,最近訪問技術論壇時,大致是這樣的:有一組。其中包括:n整數,除了的整數只有一次以外,其他已經出現3二級。如何找到只出現一次最快的數?

作者的解法有點忘記了。可是這個題突然讓我想起之前《程式設計之美》裡的一道題, 和這個題的差別是其它都出現2次,僅僅有乙個是出現一次。

它的解法很巧妙。就是把全部整數進行異或運算,最後的結果就是僅僅出現一次的那個整數。由於異或會把相同的消除掉。可是這個題是出現3次。異或已經解決不了。第一想法是空間換時間,全部數中取最大值max,然後定義乙個陣列int hasharr[max],運用hash的思想。遍歷全部整數進行hasharr[i]++運算。最後再找出hasharr[i]為1的,下標值就是所求的數。這個解法相同適用於其它出現n次的情況。解法時間複雜度為o(n),空間額外開銷為s(max)

可是我們能夠繼續深入分析。以32bit整數為例。假設把全部數的第i個位元位相加,假如和為sum。則會有例如以下等式:3(x1 + x2 + ... + xn) + x0 = sum (x1代表第乙個數的第i個位元位的值 x0代表僅僅出現一次整數的第i個位元位的值) 從這個等式中能夠看出x0的值為sum/3的餘數。由於x0不是1就是0。肯定小於3。所以我們能夠有例如以下的**:

int arr[n] = {};

int _tmain(int argc, _tchar* argv)

} if (nbitsum%3 != 0) //餘數不是1就是0

nmask <<= 1;

nbitsum = 0;

} return ndst;

}

這樣就把僅僅出現一次的數求出來了,並且假設其它數出現的次數是m次的話,mod m就能夠了。時間複雜度是o(32*n),  空間額外開銷就是幾個成員變數。

相比較而言還下面的演算法是較好,當然,還詳細介紹了情況而定。

有很多使用位操作。

正如你所指出的,使用正態變數的作用域規則 如果語句塊內使用,它適用於所有的塊和子塊。無論你把它放在每個函式或全域性宣告它,它會影響你的整個計畫是非常個人的選擇。在全球更方便,但也增加了命名衝突的潛力。t可能有助於指出,由於一塊代替單個語句 即以分號結束 塊取代分號使用。沒有分號結束一塊是必要的。有更...

位操作的簡單使用

首先列舉出以下幾個常用的位操作符 與 或 非 異或 左移 右移 作用 1 與 a b 當a和b都為1時,結果為1否則為0 int a 0x11 a 0xf0 此時a 0x10對以上步驟詳解如下 先將十六進製制數a與0xf0轉換為二進位制,然後按位相與 0x11 0001 0001 0xf0 1111...

重溫位操作 C 位操作介紹

c 位操作包括兩種 傳統的c語言方式的位操作和c 中利用bitset容器的位操作 一 傳統的c方式位操作 1.基本操作 使用乙個unsigned int變數來作為位容器。2.操作符 按位或操作符 result exp1 exp2 當exp1和exp2中對應位中至少有乙個為1時,result中對應位為...