位運算的奇淫技巧

2021-07-31 02:43:40 字數 1466 閱讀 3900

1.組資料中只有乙個數字出現了一次。

其他所有數字都是成對出現的。請找出這個數字。

a ^ b ^ b = a

;

因為只有乙個數恰好出現乙個,剩下的都出現過兩次,所以只要將所有的數異或起來,就可以得到唯一的那個數。

#include

int find(char *str,int sz)

return tmp;

}int main(void)

;int sz = sizeof(arr)/sizeof(arr[0]);

int ret = find(arr,sz);

printf("%d\n",ret);

return

0;}

2,乙個陣列中只有兩個數字是出現一次,其他所有數字都出現了兩次。

找出這兩個數字.

有了第一題的基本的思路,我們可以將陣列分成兩個部分,每個部分裡只有乙個元素出現一次,其餘元素都出現兩次。那麼使用這種方法就可以找出這兩個元素了。 不妨假設出現乙個的兩個元素是x,y,那麼最終所有的元素異或的結果就是res = x^y。並且res!=0,那麼我們可以找出res二進位制表示中的某一位是1。對於原來的陣列,我們可以根據這個位置是不是1就可以將陣列分成兩個部分。x,y在不同的兩個子陣列中。而且對於其他成對出現的元素,要麼在x所在的那個陣列,要麼在y所在的那個陣列。

#include

int find(char * str,int sz,int

*x,int

*y) for(i = 0; i < 32; i++)

for(i = 0 ; i< sz; i++) }

*y = *x^tmp;

}int main(void)

;int sz = sizeof(arr)/sizeof(arr[0]);

find(arr,sz,&x,&y);

printf("%d\n%d\n",x,y);

return

0;

3.陣列中,只有乙個數出現一次,剩下都出現三次,找出出現一次的

因為數是出現三次的,也就是說,對於每乙個二進位制位,如果只出現一次的數在該二進位制位為1,那麼這個二進位制位在全部數字中出現次數無法被3整除。 膜3運算只有三種狀態:00,01,10,因此我們可以使用兩個位來表示當前位%3,對於每一位,我們讓two,one表示當前位的狀態,b表示輸入數字的對應位,two+和one+表示輸出狀態。

0 0 0 0 0

0 0 1 0 1

0 1 0 0 1

0 1 1 1 0

1 0 0 1 0

1 0 1 0 0

one+ =(one ^ b) & (~two)

two+ = (~one+) & (two ^ b)

這個問題大家可以思考一下,下次我再更新

python奇淫技巧

01 異常處理 02 python 中re模組的re.compile 方法 03 python中with的用法 04 pycharm使用git github的pull request流程 05 python的qrcode庫生成 圓角logo myqr庫生成動態 06 python包管理工具pipen...

奇淫技巧 長期更新

老版本的iis環境 index.asp data 可爆原始碼 phpstudy後門直接寫馬 space set o history 針對你的工作關閉歷史記錄,並且由於空格的緣故,該命令本身也不會被記錄 history grep keyword history d num 刪除指定歷史命令 num代表...

MTK除錯的奇淫技巧

mtk除錯的奇淫技巧 2012 4 12 18 02 不言而喻,無論是開發還是技術支援,與bug打交道在所難免。如果掌握了一些好的方法的話,可以起到事半功倍的效果。大致說來,mtk平台,無非是以下幾種方式加trace資訊 一 向串列埠輸出。優點,方便,快捷,缺點是列印太快,有些重要資訊不易獲取,不能...