【问题标题】:Why must I use the ~ operator when clearing a bit? [duplicate]为什么在清除位时必须使用 ~ 运算符? [复制]
【发布时间】:2018-07-25 09:44:40
【问题描述】:

例如,如果我想在 y 的位置 n(在 C 中)设置一个位

y = y | (1 << n)

但是如果我想在位置 n 删除 y 中的一点,我必须在二进制 AND 之后使用 ~ 运算符。

y = y & ~(1 << n);

我的问题:为什么我必须使用 ~ 运算符?
这是因为结果变成了负区吗?

【问题讨论】:

  • 没有“负”数,只有位。拿一张纸和一支铅笔,用手做这些操作。你好德摩根。
  • 因为要设置一个位,您需要将值与具有单个位设置的掩码进行或运算。要重置(“删除”)位,您必须将值与具有所有位设置的掩码除了该位。 ~ 反转一位掩码以执行 AND。
  • "为什么我必须设置 ~ 运算符?"不,~ 是一种方式。 y = (y |(1 &lt;&lt; n)) ^ (1 &lt;&lt; n); 是另一个。解决这个问题的方法很多。除非1满足y的宽度,否则是错误的做法。

标签: c bit


【解决方案1】:

1 &lt;&lt; n for n==3(只是一个例子)给你一个模式0000000...0001000~ 否定该位 模式到11111111....11110111。使用按位与运算符 (&amp;) 将 仅将所需的位设置为 0,所有其他保持相同的值。它正在使用 事实上,有点bb &amp; 1 == b

~ 翻转所有位,与负数无关。

k-bits 序列的图形表示

pos        k-1 k-2                           0
          +---+---+-------------------+---+---+
1:        | 0 | 0 |        ···        | 0 | 1 |
          +---+---+-------------------+---+---+

pos        k-1 k-2        n   n-1           0  
          +---+---+-----+---+---+---+-----+---+
1<<n      | 0 | 0 | ··· | 1 | 0 | 0 | ··· | 0 |
          +---+---+-----+---+---+---+-----+---+


pos           k-1 k-2     n   n-1           0  
          +---+---+-----+---+---+---+-----+---+
~(1<<n)   | 1 | 1 | ··· | 0 | 1 | 1 | ··· | 1 |
          +---+---+-----+---+---+---+-----+---+

【讨论】:

    【解决方案2】:

    如果你想在右边第三位设置一点:

    Y :            01001000
    1 << 2 :       00000100
    Y | (1 << 2) : 01001100 The | is OR, bits are set to 1 if any is 1.
    

    如果您想删除该位:

    1 << 2 :         00000100
    ~(1 << 2) :      11111011  The ~ is NOT, bits are inversed
    Y :              01001100
    Y & ~(1 << 2) :  01001000 The & is AND, bits are set to 1 if both are 1.
    

    我建议你阅读更多关于Bitwise operators

    【讨论】:

      【解决方案3】:

      不,~ 与将数字解释为负数无关:波浪号 ~ 运算符将数字解释为位模式,然后将其反转(即用一替换零,用零替换一)。事实上,如果将~ 应用于无符号值,结果将保持为正。

      回想一下1 &lt;&lt; k 表达式在k 指定的位置产生一个全零模式和一个1。这是一个位掩码,可用于通过应用 OR 操作将位置 k 的位强制为 1

      现在考虑将~ 应用于它时会发生什么:所有0s 将变为1s,而唯一的1 将变为0。因此,结果是适合通过应用 AND 操作将单个位强制为零的位掩码。

      【讨论】:

        【解决方案4】:

        ~ 运算符将所有 0 变为 1,将所有 1 变为 0。为了清除您想要清除位置 n 中的 bint,它会在第 n 个位置全为 1 和零,因此将一个 1 移到第 n 个位置,~ 反转所有位。

        【讨论】:

          猜你喜欢
          • 2014-07-02
          • 2015-05-29
          • 1970-01-01
          • 1970-01-01
          • 2011-03-07
          • 1970-01-01
          • 2021-08-03
          • 1970-01-01
          • 2011-01-22
          相关资源
          最近更新 更多