我遇到了這個功能
void reverseArray(int *a,int n)
{
for(int i=0,j=n-1;i<j;i ,j--)
{
a[i]^=a[j]^=a[i]^=a[j];
}
}
這是反轉給定陣列,但我無法理解這如何反轉陣列,Xor 運算子不是只回傳非公共位。那么這背后的邏輯是什么來反轉給定的陣列。
uj5u.com熱心網友回復:
a ^= b ^= a ^= b;是一種交換兩個數字的奇特方式,稱為XOR swap。
你應該更喜歡一個更具可讀性的std::swap,或者(在 C 中)一個臨時變數。
uj5u.com熱心網友回復:
表達的目的a^=b^=a^=b是交流的值a和b。如果我們把它分解了(它變得更加清晰a_0和b_0是原始值a和b):
- 第一個任務,
a^=b使a_1=(a_0^b_0). - 第二個任務,
b^=a使b_1=(b_0^a_1)=(b_0^(a_0^b_0))=a_0 - 第三個任務,
a^=b使a_2=(a_1^b_1)=((a_0^b_0)^a_0)=b_0
因此,我們最終a擁有 的原始值,b反之亦然。
雖然運算式a^=b^=a^=b可能有效,但實際上是未定義的行為,因為 C 標準沒有指定賦值的順序。相反,它必須顯式排序:a^=b; b^=a; a^=b;。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341518.html
