我需要交換兩個變量,而不需要XOR和算術運算。 所有我可以使用的位運算就好〜,&,|,< <,>>等無XOR的按位交換
我明白了XOR的方法,但不能找出解決這個問題的另一種方式..
編輯:臨時變量也不允許。
我需要交換兩個變量,而不需要XOR和算術運算。 所有我可以使用的位運算就好〜,&,|,< <,>>等無XOR的按位交換
我明白了XOR的方法,但不能找出解決這個問題的另一種方式..
編輯:臨時變量也不允許。
由於XOR is a combination of ANDs and NOTs,所有你需要做的是在Java中實現它:
static int nand(int a, int b) {
return ~(a & b);
}
static int xor(int a, int b) {
return nand(nand(a, nand(a, b)), nand(b, nand(a, b)));
}
有了這個執行到位,你可以swap using XOR。
但是你可以使用臨時變量嗎?我的意思是,如果你能做到這一點,你可以直接交換它們。 –
所以,如果你從這個答案中拿出臨時變量,你就剩下'return nand(nand(a,nand(a,b)),nand(b,nand(a,b)));'。 –
@DM這只是爲了方便 - 可以在使用它的兩個地方用'nand(a,b)'調用來替換'nab',並且用它來完成。顯然,無論如何,這並不重要,因爲這是一個學習練習,旨在教授學生XOR可以與其他操作建模。 – dasblinkenlight
如answer of dasblinkenlight所示,xor
可以與nand
來模擬,包括not
和and
。類似地,可以使用nor
來模擬xor
,其由not
和or
組成。
的表情看起來有點複雜,到底...
public class XorTest
{
public static void main(String[] args)
{
testNand();
testNor();
}
private static void testNand()
{
int a = 1234;
int b = 5678;
a = xorNand(a, b);
b = xorNand(b, a);
a = xorNand(a, b);
System.out.println(a);
System.out.println(b);
}
private static void testNor()
{
int a = 1234;
int b = 5678;
a = xorNor(a, b);
b = xorNor(b, a);
a = xorNor(a, b);
System.out.println(a);
System.out.println(b);
}
private static int xorNand(int a, int b)
{
return ~(~(a & ~(a & b)) & ~(b & ~(a & b)));
}
static int xorNor(int a, int b)
{
return ~(~(~(a | a) | ~(b | b)) | ~(a | b));
}
}
但我不能想辦法,做同樣的「唯一」與移位或其他「運營商的新組合」 - 無論這應該是什麼意思,完全...
所以你可以用&,|替換異或(^)和〜? – Fallen
@Fallen,是的,我想我可以。我想知道是否有一個根本不同的方法,不僅僅是將更多的XOR與更多的基本操作符進行替換,並且再次使用XOR交換。也許是允許轉變或更新穎的運營商組合的東西。 – parsecer