以两个字节对两个特定位索引进行异或的最快方法

时间:2014-05-08 04:34:18

标签: c# xor

这是在C#中。我希望我可以做以下事情。

byte byte1 = 100;
byte byte2 = 100;
byte1[1] = byte1[1] ^ byte2[6]; // XOR bit at index 1 against bit at index 6

但是,我目前陷入困境:

if ((byte2 ^ (byte)Math.Pow(2, index2)) < byte2)
    byte1 = (byte)(byte1 ^ (byte)Math.Pow(2, index1));

是否有更快的方式,可能类似于我在顶部输入的内容?

编辑:

我从未听说过除XOR之外的任何按位运算符。这就是为什么原始解决方案有奇怪的Math.Pow()调用的原因。根据我对数百万次循环迭代的基准测试,我已经大大改进了我的解决方案。我确信我会通过更多阅读更快地获得它。感谢所有回复的人。

byte2 = (byte)(byte2 << (7 - index2));
if (byte2 > 127)
{
    byte buffer = (byte)(1 << index1);
    byte1 = (byte)(byte1 ^ buffer);
}

1 个答案:

答案 0 :(得分:1)

字节是不可变的,你不能改变字节的一点,就像它是一个数组一样。您需要通过掩码(&amp;)和shift(&lt;&gt;&gt;&gt;)来访问这些位,然后创建一个包含结果的新字节。

// result bit is the LSB of r
byte r = (byte)((byte1 >> 1 & 1) ^ (byte2 >> 6 & 1));

特定掩码1将擦除除最右边(LSB)之外的任何位。