大家好,我需要一些幫助來理解交換位範圍算法背後的邏輯。 「程序」交換給定位置連續的位數,它完美的工作,但我需要了解其背後的邏輯,以轉移到其他主題。 這裏是完整的「程序」http://pastebin.com/ihVpseE1的源代碼,我需要有人告訴我,如果我目前在正確的軌道上,並澄清我覺得難以理解的代碼的一部分。瞭解位交換範圍後面的邏輯
temp = ((number >> firstPosition)^(number >> secondPosition)) & ((1U << numberOfBits) - 1);
result = number^((temp << firstPosition) | (temp << secondPosition));
(number >> firstPostion)
移動給定的數UINT(5351)向右的二進制表示(>>)3次(firstPosition)。 因此00000000 00000000 00010100 11100111(5351)變成00000000 00000000 00000001 01001110,因爲據我瞭解,當你移位時,你丟失了超出範圍的數字。這是否正確?或者從最右側的位出現在左側?(number >> secondPosition)
我應用相同的邏輯如0.1,而在我的情況下secondPosition是27,因此數僅包括零(0)00000000 00000000 00000000 00000000(其是數字0) 的我移動的位數字5351右邊27次,結果只有零。((number >> firstPosition)^(number >> secondPosition))
我使用^操作上00000000 00000000 00000001 01001110和00000000 00000000 00000000 00000000 導致數00000000 00000000 00000001 01001110又名(((number >> firstPosition)^(number >> secondPosition))
((1U << numberOfBits) - 1)
這是我覺得困難的部分(如果我的理解是1. 2. 3.是否正確)((1U << numberOfBits) - 1)
是否意味着- 1)把1放在位置3(numberOfBits)並填充(0),然後從該數字的十進制表示中減去1 或
- 2)將數字1的二進制表示向左移動3次(numberOfBits),然後從該數字的十進制表示中減去1數
如果我的邏輯到目前爲止是正確的,那麼我們應用上((number >> firstPosition)^(number >> secondPosition))
和((1U << numberOfBits) - 1)
結果的&操作。 和我遵循相同的邏輯 result = number^((temp << firstPosition) | (temp << secondPosition));
爲了得到結果。
對不起,這個問題很長很可能很愚蠢,但我真的不能問任何人,只要你們幫忙。謝謝大家。
http://stackoverflow.com/questions/12363715/swapping-individual-bits -with-xor?rq = 1 – benadaephondelat
謝謝。您的回答與頂部主題一起幫助了我。我還有一個問題,即使您說(1 << 3) - 1會產生3或111的二進制數。但在二進制111是7? – benadaephondelat
@ user3443236哦,我會解決這個問題,你是對的。 – Luaan