c++ - Xor -> And -> Xor 做什么?

标签 c++ bitwise-operators

我在算法方面遇到了问题。

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

newValue = (((currentValue XOR xorMask1) AND andMask) XOR xorMask2)

描述如下:

If both xor-masks have the same value then this function inserts the bits of the xor-mask into the bit locations where the and-mask is 1. The other bits remain unchanged.

所以我对这个函数的期望是当我有以下字节时:00101101 并且我将 01000000 用于异或掩码和与掩码,即只有第二位会被设置为 1,结果将是 01101101

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

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

我只想问这个简单的问题:有没有一种方法可以有效地使用此函数来设置(或取消设置/更改)单个位(无需特别询问当前值)? p>

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

重要信息 在我的文档 PDF 中,XOR 和第一个 xorMask1 之间似乎有一点空间,所以这可能是 ~! 或其他一些否定符号可能已经存在,并且很可能由于一些奇怪的编码问题而丢失。所以我将测试该函数是否按照文档所述或函数声明所述进行操作。戴好你的 Helm ,结果会发回(请打鼓)......

最佳答案

     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

关于c++ - Xor -> And -> Xor 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12672966/

相关文章:

c - C 中是否可以使用按位运算符生成 x%10(模 10)?

c++ - 链接器错误:无法解析构造函数

c - 您不需要取消引用指针来对寄存器进行按位操作吗?

c - Eratosthenes 筛法 - 按位优化问题

c++ - 屏幕上的客户端矩形坐标

c - 使用按位运算乘以 3

javascript - 获取整数的二进制表示

c++ - 字符串 vector (从键盘读取)

c++ - 禁用来自 .tags 文件的警告

c++ - Codeblocks 编译,GCC 不编译