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



这是在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));

是否有更快的方法,可能类似于我在顶部输入的东西?

编辑:

我从来没有听说过除异或以外的任何位操作符。这就是为什么最初的解决方案有奇怪的Math.Pow()调用。根据我对数百万循环迭代的基准测试,我已经大大改进了我的解决方案。我相信多读些书会学得更快。感谢所有回应的人。

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

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

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

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

最新更新