代码之家  ›  专栏  ›  技术社区  ›  Flavius

如何按位计算或使用and、xor和shift?

  •  5
  • Flavius  · 技术社区  · 16 年前

    这个问题似乎很有条理

    我有一个只实现and、xor、shl和shr的虚拟机,但我必须执行“或0x01”操作。

    4 回复  |  直到 13 年前
        1
  •  6
  •   user282727    16 年前

    首先,对以下两个变量进行正确的按位计算就足够了,因为它们涵盖了所有组合:
    A=0101
    B=0011

    我们想要
    0101
    0011
    甲或乙
    0111

    对于xor我们得到

    0101
    0011
    异或B
    0110

    因为我们得到

    0101
    0011
    甲、乙
    0001

    所以如果我们用异或连接它们,我们就完成了。

    (a xor b)xor(a和b)

        2
  •  2
  •   ndim    16 年前

    我就从

    a xor b = ((not a) and b) or (a and (not b))
    

    把布尔代数放在上面,直到它看起来像

    a or b = <expression using only and, xor>
    

    不可否认,这可能比走“尝试所有可能的比特组合”路线实际要做的工作更多,但随后你确实要求家庭作业解决方案的想法。:)

        3
  •  1
  •   t0mm13b    16 年前

    维基百科上总结的真相表 here 还有喘息,基本的CS101材料, De Morgan's Law

    AND
    0 & 0   0
    0 & 1   0
    1 & 0   0
    1 & 1   1
    
    
    OR
    0 | 0   0
    0 | 1   1
    1 | 0   1
    0 | 0   1
    
    
    XOR
    0 ^ 0   0
    0 ^ 1   1
    1 ^ 0   1
    1 ^ 1   0
    

    左移包括从右向左移动位,假设:

    +-+-+-+-+-+-+-+-+
    |7|6|5|4|3|2|1|0|
    +-+-+-+-+-+-+-+-+
    |0|0|0|0|0|1|0|0| = 0x4 hexadecimal or 4 decimal or 100 in binary
    +-+-+-+-+-+-+-+-+
    
    Shift Left by 2 places becomes
    +-+-+-+-+-+-+-+-+
    |7|6|5|4|3|2|1|0|
    +-+-+-+-+-+-+-+-+
    |0|0|0|1|0|0|0|0| = 0x10 hexadecimal or 16 decimal or 10000 in binary
    +-+-+-+-+-+-+-+-+
    
    Shift Right by 1 places becomes
    +-+-+-+-+-+-+-+-+
    |7|6|5|4|3|2|1|0|
    +-+-+-+-+-+-+-+-+
    |0|0|0|0|1|0|0|0| = 0x8 hexadecimal or 8 decimal or 1000 in binary
    +-+-+-+-+-+-+-+-+
    

    然后是根据上面的真值表组合位操作的问题…

        4
  •  0
  •   Chris Dodd    16 年前

    我只想扩大 DeMorgan's law : A or B = not(not A and not B) . 你可以计算 not 与所有1位进行异或运算。