2014-03-24 62 views
0

大家好,我需要一些幫助來理解交換位範圍算法背後的邏輯。 「程序」交換給定位置連續的位數,它完美的工作,但我需要了解其背後的邏輯,以轉移到其他主題。 這裏是完整的「程序」http://pastebin.com/ihVpseE1的源代碼,我需要有人告訴我,如果我目前在正確的軌道上,並澄清我覺得難以理解的代碼的一部分。瞭解位交換範圍後面的邏輯

temp = ((number >> firstPosition)^(number >> secondPosition)) & ((1U << numberOfBits) - 1); 
result = number^((temp << firstPosition) | (temp << secondPosition)); 
  1. (number >> firstPostion)移動給定的數UINT(5351)向右的二進制表示(>>)3次(firstPosition)。 因此00000000 00000000 00010100 11100111(5351)變成00000000 00000000 00000001 01001110,因爲據我瞭解,當你移位時,你丟失了超出範圍的數字。這是否正確?或者從最右側的位出現在左側?

  2. (number >> secondPosition)我應用相同的邏輯如0.1,而在我的情況下secondPosition是27,因此數僅包括零(0)00000000 00000000 00000000 00000000(其是數字0) 的我移動的位數字5351右邊27次,結果只有零。

  3. ((number >> firstPosition)^(number >> secondPosition)) 我使用^操作上00000000 00000000 00000001 01001110和00000000 00000000 00000000 00000000 導致數00000000 00000000 00000001 01001110又名 (((number >> firstPosition)^(number >> secondPosition))

  4. ((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)); 爲了得到結果。

對不起,這個問題很長很可能很愚蠢,但我真的不能問任何人,只要你們幫忙。謝謝大家。

回答

0

你拿出來4.的兩個備選方案實際上是相同的:) 訣竅是,這將產生二進制1 s的字符串,直到給定的numberOfBits - 即。 (1 << 3) - 1以二進制產生7111 - 換句話說,「只給我numberOfBits最低有效位」。

基本上,你已經描述了這一點,如果過分羅嗦。

第一行的結果是一個numberOfBits位的序列。該值是從兩個不同索引開始並且長度爲numberOfBits的位序列之間的xor。 and然後簡單地丟棄高於numberOfBits的位。

第二行然後利用事實a^b^a == bb^a^b == a,和操作的順序並不重要 - 異或操作是可交換的。

只要兩個序列不重疊,不交叉的小數點,它應該只是罰款:)

+0

http://stackoverflow.com/questions/12363715/swapping-individual-bits -with-xor?rq = 1 – benadaephondelat

+0

謝謝。您的回答與頂部主題一起幫助了我。我還有一個問題,即使您說(1 << 3) - 1會產生3或111的二進制數。但在二進制111是7? – benadaephondelat

+0

@ user3443236哦,我會解決這個問題,你是對的。 – Luaan