首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xor ->和-> Xor是做什么的?

Xor ->和-> Xor是做什么的?
EN

Stack Overflow用户
提问于 2012-10-01 12:08:40
回答 7查看 1.1K关注 0票数 2

我在算法上出了问题。

我有一个用于IO的字节,可以使用一个名为XorAndXor的方法来设置其中的某些位。该算法的工作原理如下:

代码语言:javascript
复制
newValue = (((currentValue XOR xorMask1) AND andMask) XOR xorMask2)

该说明内容如下:

如果两个xor-掩码都具有相同的值,则该函数将xor-掩码的位插入到和掩码为1的位位置,其他位则保持不变。

因此,我对这个函数的期望是,当我有以下字节时:00101101和我使用01000000作为xor-掩码和作为和掩码,只有第二个位将被设置为1,结果将是01101101

但是,在进行数学运算和遍历函数时,结果是00000000

我做错了什么,或者这个函数有什么我不明白的吗?这种低级编程已经有一段时间了,所以我不知道这是否是一种经常使用的方法,以及为什么和如何使用它。

--让我问一个简单的问题:是否有办法有效地使用这个函数来设置(或取消/更改)一个位(而不专门询问当前值)?

例如,当前的值是00101101 (我不知道这个),但是我只想确保设置了第二个位,所以结果必须是01101101

重要信息在我的文档PDF中,在XOR和第一个xorMask1之间似乎有一点空间,所以这可能是~!或其他否定符号可能已经存在的地方,并且很可能由于一些奇怪的编码问题而丢失。因此,我将测试这个函数,如果它做的是文档说的或者函数声明说的。坚持您的头盔,将张贴与结果(鼓请).

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-05 16:18:53

我已经研究了很长一段时间了,我想我看到了其他人不一样的东西。XOR和XOR进程对于设置多个字节而不干扰其他字节非常有用。例如,我们有一个给定的字节,在这个字节中,我们希望设置为1x1x xxx0,其中x是我们不关心的值。使用XOR和XOR进程,我们使用以下掩码来打开和关闭我们不关心的比特。我们使用XOR掩码打开位,使用和掩码关闭位,对于缺省值我们不关心的掩码( XOR掩码x XOR 0=x,和掩码x和1= x)。因此,考虑到我们的期望价值,我们的面具如下所示:

代码语言:javascript
复制
XOR: 10100000
AND: 01011110

如果我们的神秘点是10010101,那么数学就是这样的:

代码语言:javascript
复制
10010101
10100000 XOR
00110101 =
01011110 AND
00010100 =
10100000 XOR
10110100 =

我们想要的比特是打开的,而我们想要关闭的比特是关闭的,不管它们先前的状态如何。

这是一个管理多位的巧妙逻辑。

编辑:最后一个XOR是用来切换的。如果您知道有一点需要更改,但不需要更改,请将其设置为1。因此,让我们假设我们希望切换第三位,否则掩码将是:

代码语言:javascript
复制
XOR1 10100000
AND  01011110
XOR2 10100100

最后一次交互将更改为

代码语言:javascript
复制
00010100 =
10100100 XOR
10110000 =

第三位被切换。

票数 2
EN

Stack Overflow用户

发布于 2012-10-01 12:19:21

代码语言:javascript
复制
     00101101 
XOR  01000000
-------------
     01101101
AND  01000000
-------------
     01000000 
XOR  01000000
-------------
     00000000

文件不对。这不是我第一次看到一个完全脱离最初实现的实现,但是没有人费心更新文档。

我做了一次快速检查,所以我可能错了,但下面的内容与文档一致:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-10-01 12:32:48

要回答你非常简单的问题,这就是如何设置一点:

代码语言:javascript
复制
value |=  0x100;  

以下是如何清除一点:

代码语言:javascript
复制
value &= ~0x100;

在本例中,0x100是二进制的000100000000,所以它设置/清除位8(从右边计数)。

其他人已经指出了您的代码示例是如何不执行它声称的操作的,因此我将不再详细说明这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12672966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档