【问题标题】:How to Determine which bits to set/clear based on a computation如何根据计算确定要设置/清除的位
【发布时间】:2016-06-15 17:37:52
【问题描述】:

我有一个变量:

  ushort statusRegister;

此变量通过设置或清除其各个位来跟踪各种计算的结果。位定义为:

  • Bit0 = 进位
  • Bit1 = 溢出
  • Bit2 = 零
  • Bit3 = 符号
  • Bit4 = IRQ
  • Bit5 = 辅助进位
  • Bit6 = 1 未使用
  • Bit7=1 未使用

鉴于以下情况:

   Ushort  varA = 0x8B;
   Ushort varb = 0x24;
   Ushort result = varA + varB;

如何根据计算结果设置或清除这些单独的位?我不知道如何确定计算是否导致了位进位或半进位,或者是否发生了溢出。

感谢您的建议

【问题讨论】:

  • C# 不会公开原始信息,例如是否有进位。如果你想知道在你得到结果后你将不得不做一些额外的数学运算来确定进位是否发生。没有发布作为答案,因为我不知道数学是什么。

标签: c# bit-manipulation bit


【解决方案1】:

这是经过额外讨论后的答案。考虑到反馈后就简单多了。

但是,我只是以进位位为例,说明如何处理 statusRegister 中的每个位。不确定您是否需要我们扩展其他位。

所以更新寄存器是这样的:

bool carry = result < Math.Max(varA, varB);
statusRegister |= (ushort)((carry) ? 0x1 : 0x0); //set the carry bit

根据您的情况,您可能需要也可能不需要在迭代之间清除状态寄存器。如果是这样,你可以这样:

statusRegister &= 0xFFFE; //clear the carry bit first
statusRegister |= (ushort)((carry) ? 0x1 : 0x0); //then set the carry bit

【讨论】:

  • 为什么这么复杂?携带只是result &lt; varA。半进位类似,只是先蒙版
  • @user497745 不,不是任务,我希望是这样,也许那时我会知道我到底喜欢什么。我正在尝试编写 MC6808 虚拟机。我有一个旧的(1985 年)机器人,它使用 MC68008 作为其大脑。我很欣赏你的回应,并会尝试一下,但我很难理解所有这些逻辑,尤其是你的进位变量。你能详细说明吗?如果没有,我会在适当的时候弄清楚。
  • @Harold 我非常感谢您的简单回答。从我随时收集的结果来看,结果小于 varA a 进位结果?这对任何价值都成立吗?您在回答中选择了 varA varB 会产生什么影响。减法呢?
  • @KenM result &lt; varBsame 条件。实际上,您也可以与min(a, b)max(a, b) 进行比较,它们都意味着 1 必须“落到最后”,这是两个未签名事物之和小于任何一个加法的唯一方法.你可以用加法来写减法,你可能需要翻转结果进位,这取决于你的目标 CPU,我不确定 68k 需要什么。
  • @Harold 好的。我想你是正确的。我从心理上开始走这条路,但不确定是否有任何边缘情况需要担心环绕导致值小于一个但不是另一个。这就是你所暗示的max(a,b)吗?因为就是这样! carry = result &lt; max(vara,varb) 会起作用。
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-05-06
  • 1970-01-01
相关资源
最近更新 更多