我需要在没有XOR和算术运算的情况下交换两个变量。 我可以使用的是按位操作,如〜,&,|,<<,>>等等。
我理解XOR方法,但无法找到相反的方法..
编辑:也不允许使用临时变量。
答案 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
模拟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));
}
}
和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;
但我想不出一种方法可以“改变”或“其他”运营商的新颖组合“ - 只不过这应该意味着什么......”