方法1:因為沒有異或^這樣的直接運算子,計算同或可以轉為string型別進行操作,再轉為需要的型別
stringa,b,res;
cin >> a>>b; //
0101 1001 這裡需要控制一下輸入的長度要一樣,如果不同的話要自己實現短的前面補0
int length =a.length();
for (int i = 0; i i)
cout<
就是這麼簡單。。。愣是弄了三個小時,查遍了整個搜尋引擎,基本都是按照運算法則:~(a^b)的思想出發進行實現的,導致我一直困在這個思想裡面 唉。下面記錄一下踩雷經過
1.首先想到**
unsigned inta, b,c;
a =0b1010;
b =0b0000;
c = ~(a^b);
很明顯不會成功,因為計算機儲存a,b是按4個位元組儲存的,前面會有很多0。所以最後結果是乙個很大的整數。所以想:怎麼才能只運算我需要的這幾位,前面的0都忽略
按照裡面最後乙個回答,使用bitset成功實現了基於~(a^b)思想的同或運算操作
方法二:bitset可以成功 但是有限制
unsigned inta, b,c;
a =0b1010;
b =0b0000;
c = ~(a^b);
cout
<(a)<<"\n"
; cout
<< bitset<4>(b) << "\n"
; cout
<< bitset<4>(c) << "
\n";
但很快問題又出現了,因為bitset初始化的長度必須是常量,在編譯階段就已經確定,但我要實現的是不定長度的二進位製同或運算,沒法提前精準知曉長度(即使定義很長的長度,bitset會在前面自動補0,這樣就和沒有用bitset一樣了,沒有意義)
自然的,我就想能不能像new定義陣列一樣,有動態定義bitset的方法,然後在stackoverflow中找到答案(
但我並沒有去使用dynamic_bitset而是從裡面一句話vector得到啟發,為什麼不用模擬方法而非要用算術運算呢,雖然運算子會更快,但我目前也沒有那個必要啊。
最後,既然是模擬,陣列並沒有string型別的輸入簡單。所以最後採用string型別的兩個變數模擬同或操作,這麼簡單的事愣是搞了這麼久 kao。。。。。。。。。。。
最後是一題同或運算的筆試題:9/8 citrix筆試第三題
題目:給乙個二進位制的數(例如:1010)求0000最少需要翻轉幾次才能得到1010,翻轉運算有特殊定義,當左邊的1翻轉為0時,其右邊的所有字元都取反
例子:0000—》0001—》0010—》0101—》1010 需要4次 第一次翻轉最後乙個數,第二次翻轉倒數第二個數,同時其後面的取反。第三次翻轉第二個數。第四次翻轉第乙個數。完成
分析:應該是按照1010和0000不斷取同或直到0,結果就是同或的次數 ,沒法驗證,應該是對的。
**:
string xnor(string a, stringstr)
return
res;
}int
main()
cout
<< res-1
;}
C 使用AutoResetEvent實現同步
簡介 autoresetevent boolinitialstate 建構函式,用乙個指示是否將初始狀態設定為終止的布林值初始化該類的新例項。false 無訊號,子執行緒的waitone方法不會被自動呼叫 true 有訊號,子執行緒的waitone方法會被自動呼叫 reset 將事件狀態設定為非終止...
C 使用AutoResetEvent實現同步
前幾天碰到乙個執行緒的順序執行的問題,就是乙個非同步執行緒往adgailv介面傳送乙個資料請求。另外乙個非同步執行緒往b介面傳送乙個資料請求,當a和b都執行成功了,再往c介面傳送乙個請求。說真的,一直做bs專案,對執行緒了解,還真不多。就知道autoresetevent這個東西和執行緒有關,用於處理...
C 操作本地或遠端服務
using system using system.management namespace servicesmanage public win32servicemanager string host,string username,string password host root cimv2 w...