这是在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);
}
答案 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)之外的任何位。