没有异或的按位交换
Bitwise swap without 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。
如所示,xor
可以用nand
模拟,由not
和and
组成。类似地,xor
可以用 nor
模拟,由 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));
}
}
但我想不出一种方法可以对班次或其他 "only" 执行相同的操作 "novel combinations of operators" - 无论这意味着什么,确切地说...
我需要在不进行异或和算术运算的情况下交换两个变量。 我能用的只有像~、&、|、<<、>>等位运算
我理解 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。
如xor
可以用nand
模拟,由not
和and
组成。类似地,xor
可以用 nor
模拟,由 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));
}
}
但我想不出一种方法可以对班次或其他 "only" 执行相同的操作 "novel combinations of operators" - 无论这意味着什么,确切地说...