从逐位OR组合中确定原始常数
Determining original Constants from bitwise OR combinations
假设我只有两个正在设置的标志(bOld和bHot)。我发现了所有可能的组合应该相等。那么,我如何从下面确定原始(或兼容)常数?
When bCold and bHot are both turned ON = 0x4100
When bCold and bHot are both turned OFF = 0x8200
If bCold is ON and bHOT is OFF = 0x8100
If bCold is OFF and bHOT is ON = 0x4200
知道了以上内容,我应该将bOld和bHot设置为相等的值吗?
#define bCold ((ULONG)0x???)
#define bHot ((ULONG)0x???)
// Turn them on sometime later
long lCONFIG_FLAGS = bCold | bHOT;
假设0bXXXXXXXY
表示二进制,其中Y是小于的有效位。
假设结果是用逐位操作设置的:
你的数字是由两个字节组成的。由于所有数字都以00结尾,因此右侧(低有效)字节始终为0b00000000。让我们看看左边(更重要的)字节:
当bOld和b Hot均打开时=
0x4100
=0b01000001
当bOld和b Hot均关闭时=
0x8200
=0b10000010
如果bOld为ON且bHOT关闭=
0x8100
=0b10000001
如果bOld为OFF,且bHOT处于ON=
0x4200
=0b01000010
从中可以看出,最左边的两位设置bHot,最右边的两位则设置bOld(右=较低有效性)。
So:
0b01000000 = *bHot* ON -= `0x40`
0b00000001 = *bCold* ON = `0x01`
0b10000000 = *bHot* OFF = `0x80`
0b00000010 = *bCold* OFF = `0x02`
现在,加上正确的字节,我们说它总是零,你就会得到
*bHot* ON = 0x4000, OFF = 0x8000
*bCold* ON = 0x0100, OFF = 0x0200
该结果通过按位"1"来设置;OR";
假设通过简单地添加数字来设置结果:
(这是错误的,因为你的帖子名称中包含了按位或提及,但还是让我们尝试一下,只是为了好玩)一个简单的方程将显示这些数字:
*bCold* OFF: 0x0200, ON: 0x0100
*bHot* OFF: 0x8000, ON: 0x4000
可以通过简单地添加数字来设置结果,例如,两个OFF的0x0200 + 0x8000 = 0x8200
。
结论
正如你所看到的,所以最终的结果是:
*bCold* OFF: 0x0200, ON: 0x0100
*bHot* OFF: 0x8000, ON: 0x4000
C: ON H: ON = 0100 0001 0000 0000
C:OFF H:OFF = 1000 0010 0000 0000
C: ON H:OFF = 1000 0001 0000 0000
C:OFF H: ON = 0100 0010 0000 0000
逐位异或交替值以获得感兴趣的位,然后逐位和这些位以获得实际掩码:
C:OFF OR C: ON = 1000 0010 0000 0000 XOR 1000 0001 0000 0000 = 0000 0011 0000 0000
C:OFF = 1000 0010 0000 0000 AND 0000 0011 0000 0000 = 0000 0010 0000 0000
C: ON = 1000 0001 0000 0000 AND 0000 0011 0000 0000 = 0000 0001 0000 0000
所以C使用第一个字节的后半部分,0x0100是掩码,0x0200是掩码外
H:OFF OR H: ON = 1000 0010 0000 0000 XOR 0100 0010 0000 0000 = 1100 0000 0000 0000
H:OFF = 1000 0010 0000 0000 AND 1100 0000 0000 0000 = 1000 0000 0000 0000
H: ON = 0100 0010 0000 0000 AND 1100 0000 0000 0000 = 0100 0000 0000 0000
所以H使用第一个字节的前半部分,0x4000是掩码,0x8000是掩码外
假设
When bCold and bHot are both turned OFF = 0x8200
If bCold is ON and bHOT is OFF = 0x8100
bHot可能是前半个字节,因为它保持不变,bOld是后半个字节,由于它发生了变化。这样你就可以得到:
bHot is ON: 0x4000
bCold is ON: 0x0100
bHot is OFF: 0x8000
bCold is OFF: 0x0200
可能还有其他解决方案,我还没有检查更新:是的,确实存在其他解决方案:将变量分配给"b关闭"等四个语句,并将这些语句写成四个方程组。你会发现,你会得到无限多的解决方案,通过调整上面的倍数[1-11-1]。例如,这也满足方程:
Using + to add: Using XOR to add:
bHot is ON: 0x4100 bHot is ON: 0x4100
bCold is ON: 0x0000 bCold is ON: 0x0000
bHot is OFF: 0x8100 bHot is OFF: 0x8100
bCold is OFF: 0x0100 bCold is OFF: 0x0300
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 如何将原始字节附加到 std::vector?
- 从堆栈分配的原始指针构造智能指针
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 将unique_ptr分配给原始指针
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 从原始字节解码协议缓冲区(以 C++为单位)
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- C++:尝试使用等效的 STL 算法消除原始循环
- 如何在连接器 C++ 中将原始字节转换为字符串
- 为什么 g++ 使用 movabs 和一个奇怪的常数来简单还原?
- 通过引用传递类不会更改原始类
- 实现使用模板化类而不使原始类成为模板的类
- 如何在 2d 矢量 c++ 中复制元素并将其放在原始元素旁边
- 从逐位OR组合中确定原始常数