没有XOR的按位交换

时间:2017-02-12 01:12:27

标签: java algorithm bit-manipulation bitwise-operators

我需要在没有XOR和算术运算的情况下交换两个变量。 我可以使用的是按位操作,如〜,&,|,<<,>>等等。

我理解XOR方法,但无法找到相反的方法..

编辑:也不允许使用临时变量。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

answer of dasblinkenlight所示,xor可以使用nand模拟notandxor。类似地,nor可以使用not模拟orpublic 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)); } } var range = m_XlWrkSheet.UsedRange; range.SpecialCells(XlCellType.xlCellTypeConstants).EntireRow.Hidden = true; range.SpecialCells(XlCellType.xlCellTypeVisible).Delete(XlDeleteShiftDirection.xlShiftUp); range.EntireRow.Hidden = false;

表达式最终看起来有点复杂......

object[,] values = m_XlWrkSheet.UsedRange.Value2 as object[,];

// some code here (the values start from values[1, 1] not values[0, 0])

m_XlWrkSheet.UsedRange.Value2 = values;

但我想不出一种方法可以“改变”或“其他”运营商的新颖组合“ - 只不过这应该意味着什么......”