我在算法上出了问题。
我有一个用于IO的字节,可以使用一个名为XorAndXor的方法来设置其中的某些位。该算法的工作原理如下:
newValue = (((currentValue XOR xorMask1) AND andMask) XOR xorMask2)该说明内容如下:
如果两个xor-掩码都具有相同的值,则该函数将xor-掩码的位插入到和掩码为1的位位置,其他位则保持不变。
因此,我对这个函数的期望是,当我有以下字节时:00101101和我使用01000000作为xor-掩码和作为和掩码,只有第二个位将被设置为1,结果将是01101101。
但是,在进行数学运算和遍历函数时,结果是00000000。
我做错了什么,或者这个函数有什么我不明白的吗?这种低级编程已经有一段时间了,所以我不知道这是否是一种经常使用的方法,以及为什么和如何使用它。
--让我问一个简单的问题:是否有办法有效地使用这个函数来设置(或取消/更改)一个位(而不专门询问当前值)?
例如,:当前的值是00101101 (我不知道这个),但是我只想确保设置了第二个位,所以结果必须是01101101。
重要信息在我的文档PDF中,在XOR和第一个xorMask1之间似乎有一点空间,所以这可能是~或!或其他否定符号可能已经存在的地方,并且很可能由于一些奇怪的编码问题而丢失。因此,我将测试这个函数,如果它做的是文档说的或者函数声明说的。坚持您的头盔,将张贴与结果(鼓请).
发布于 2012-10-05 16:18:53
我已经研究了很长一段时间了,我想我看到了其他人不一样的东西。XOR和XOR进程对于设置多个字节而不干扰其他字节非常有用。例如,我们有一个给定的字节,在这个字节中,我们希望设置为1x1x xxx0,其中x是我们不关心的值。使用XOR和XOR进程,我们使用以下掩码来打开和关闭我们不关心的比特。我们使用XOR掩码打开位,使用和掩码关闭位,对于缺省值我们不关心的掩码( XOR掩码x XOR 0=x,和掩码x和1= x)。因此,考虑到我们的期望价值,我们的面具如下所示:
XOR: 10100000
AND: 01011110如果我们的神秘点是10010101,那么数学就是这样的:
10010101
10100000 XOR
00110101 =
01011110 AND
00010100 =
10100000 XOR
10110100 =我们想要的比特是打开的,而我们想要关闭的比特是关闭的,不管它们先前的状态如何。
这是一个管理多位的巧妙逻辑。
编辑:最后一个XOR是用来切换的。如果您知道有一点需要更改,但不需要更改,请将其设置为1。因此,让我们假设我们希望切换第三位,否则掩码将是:
XOR1 10100000
AND 01011110
XOR2 10100100最后一次交互将更改为
00010100 =
10100100 XOR
10110000 =第三位被切换。
发布于 2012-10-01 12:19:21
00101101
XOR 01000000
-------------
01101101
AND 01000000
-------------
01000000
XOR 01000000
-------------
00000000文件不对。这不是我第一次看到一个完全脱离最初实现的实现,但是没有人费心更新文档。
我做了一次快速检查,所以我可能错了,但下面的内容与文档一致:
newValue = (((currentValue XOR xorMask1) AND ~andMask) XOR xorMask2)
00101101
XOR 01100100
-------------
01001001
AND 10011011
-------------
00001001
XOR 01100100
-------------
01101101下面是表达式New = Curr XOR Xor1 AND ~And XOR Xor2的逻辑表,其中Xor1 == Xor2
CURR: 0 1 0 1 0 1 0 1
XOR1: 0 0 1 1 0 0 1 1
AND: 0 0 0 0 1 1 1 1
XOR2: 0 0 1 1 0 0 1 1
-----------------------
NEW: 0 1 0 1 0 0 1 1
---v--- ---v---
same as same as
current xor mask
where where
AND = 0 AND = 1发布于 2012-10-01 12:32:48
要回答你非常简单的问题,这就是如何设置一点:
value |= 0x100; 以下是如何清除一点:
value &= ~0x100;在本例中,0x100是二进制的000100000000,所以它设置/清除位8(从右边计数)。
其他人已经指出了您的代码示例是如何不执行它声称的操作的,因此我将不再详细说明这一点。
https://stackoverflow.com/questions/12672966
复制相似问题