【问题标题】:Bit manipulation (clear n bits)位操作(清除 n 位)
【发布时间】:2013-06-12 14:02:33
【问题描述】:

阅读 Gayle Laakmann McDowell 的《Cracking the coding interview》一书,在位操作一章中,它提出了一个问题:

求(假设数字用4位表示)的值:

1011 & (~0 << 2)

现在,~0 = 1 并将其向左移动两次产生 100(= 0100 以完成 4 位)。将 1011 与 0100 相加等于 0000。

但是,我的答案是 1000。

【问题讨论】:

    标签: c++ c bit-manipulation


    【解决方案1】:
    1011 & (~0 << 2)
    
    1. ~0 不是 1,而是 111120xF16
    2. 1111 向左移动两次得到1100(最左边的两个位已被删除并从右边用0 填充)。
    3. 添加1011 &amp; 1100 会在对应的位位置为1 的每个位位置为1,否则为0。由此得出结果为1000

    【讨论】:

      【解决方案2】:

      ~0 不是 1 而是 1111(或 0xf)。 ~ 运算符是 按位 NOT 运算符,而不是 逻辑 运算符(应该是 !)。

      因此,当左移 2 位时,最后四位是 1100。而1100 &amp; 1011 就是1000

      【讨论】:

      • "假设数字用 4 位表示" --> ~0 = 0xF.
      • @icepack 删除 7 个fs 完成。经验教训:bit != octet.
      • 所以如果问题是 1011 & (~0000
      • @user85030 是的。就像07:567:56 表示相同的时间。
      • 谢谢。我已经接受了你的回答。将此与马特的响应相结合“0 将默认为整数,并且 NOT 操作将反转所有位,而不仅仅是第一个。”完全回答了我的问题。
      【解决方案3】:

      ~ 是按位补码运算符。

      ~0 的值应该是 4 位的1111

      1011 & (~0 << 2)
      = 1011 & ( 1111 << 2)
      = 1011 &  1100
      = 1000
      

      【讨论】:

        【解决方案4】:

        ~0 不等于 1。0 将默认为整数,NOT 操作将反转所有位,而不仅仅是第一个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多