两个短整数的异或运算

9

我正在使用传统的方法用 XOR ^ 运算符计算两个 short integersXOR。以下是该方法 -

short a=197;
short b=341;
short y = (short) (a ^ b);

然而,XOR 操作总是返回整数,但在我的情况下输入是短整型,这就是为什么我将短整型转换为 XOR 输出的原因。XOR 可以用不同的方式计算(例如:使用 BigInteger 等),但就性能而言(时间较短),哪种方法最适合短整型?在考虑性能的同时,我应该先使用 Integer.toBinaryString(number) 将每个短整型数值转换为二进制数,然后应用按位异或运算吗?
3个回答

10
short s1 = ...
short s2 = ...
short result = (short) (s1 ^ s2);

这是XOR两个short的最有效方法。它不会运行创建BigInteger的开销,并且强制转换永远不会导致溢出问题,因为s1s2都是short


5
“将每个短整数转换为二进制数”这句话并不是很清楚——短整数本身就是一个数字,它的表示自然是二进制的。”
“你只需要:”
short x = ...;
short y = ...;
short z = (short) (x ^ y);

你需要进行强制类型转换,因为 x ^ y 会将两个操作数提升为 int 类型,结果也将是一个 int 类型。然而,结果必须在 short 范围内,因此可以安全地执行此转换而不会丢失信息。
有关异或运算的更多信息,请参见 JLS 的 第15.22.1节,有关二进制数字提升的信息,请参见 第5.6.2节

@EricJ:你还在看我没有在(x ^ y)周围加括号的版本吗?我已经修复了一段时间 :) - Jon Skeet
@JonSkeet:通过“将每个短整数转换为二进制数”,我是指是否应该先使用Integer.toBinaryString(number)将每个短整数转换为二进制字符串,然后再应用按位异或 - ravi
@RaviJoshi:你为什么想这样做?当它已经在内存中以二进制形式存在时,为什么要将其转换为字符串?按位异或意味着处理位而不是字符,对吗... - Jon Skeet
@JonSkeet:是的,我现在明白了。谢谢。short c = (short) (a ^ b); :) 非常感谢你。 - ravi

1

我不完全确定你的问题是什么,但希望这可以帮到你:

Java将两个操作数强制转换为int类型。 这就是结果是int的原因。

因此,您的shorts将自动转换为int,并且异或操作将在整数操作数上非常有效地完成。

如果操作数中有一个是long,则两种类型将被强制转换为long。 但是,在您的情况下不适用。

总之,鉴于您的两个输入都是短的,如果需要短的结果,则最高效的方法是

short result = (short) (operandA ^ operandB);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接