【问题标题】:Off rightmost set bit of an integer关闭整数的最右边设置位
【发布时间】:2014-12-18 06:08:33
【问题描述】:

我只需要关闭最右边的设置位。 我的方法是找到最右边的位置,然后关闭那个位。我写这段代码就是为了这样做..

int POS(int n)
{
    int p=0;

    while(n)
    {
        if(n%2==0)
        {
            p++;
        }
        else
        {
            break;
        }  
        n=n/2;
     }
     return p;
  }

 int main(void)
 {

 int n=12;
 int p = POS(n);
 printf("%d \n", n&~(1<<p));

 return 0;

 }

有没有最简单的方法?

【问题讨论】:

    标签: c++ c bit


    【解决方案1】:

    阅读http://www.geeksforgeeks.org/turn-off-the-rightmost-set-bit/

    /* unsets the rightmost set bit of n and returns the result */
    int fun(unsigned int n)
    {
      return n&(n-1);
    } 
    

    【讨论】:

      【解决方案2】:

      如果您要清除当前设置的最低有效位使用:

      num = num & (num - 1);
      

      这背后的原因是,当您减去一个数字时,xxxx1000(其中x 表示“原始值”)将变为xxxx0111,然后将这两个值相加得到:

        xxxx1000
      & xxxx0111
        --------
        xxxx0000
      

      清除最右边的一位。


      如果我误解了这个问题,如果你想将最右边(最低有效)位设置为零,你只需要:

      num = num - (num % 2);
      

      这只是从奇数中减去一个,从偶数中减去一个,有效地使结果二进制xxxxxxx0

      要清除位 0 是最低有效位的 特定 位,请使用:

      num = num & ~(1 << bitpos);
      

      这会设置一个位掩码 ike 00001000 并将其反转为 11110111 以便它会清除相关位:

        xxxxxxxx
      & 11110111
        --------
        xxxx0xxx
      

      只要确保您使用的是无符号整数,它可能的行为与您对有符号值的预期不同。

      【讨论】:

        【解决方案3】:

        我想你正在寻找这个:

        printf("%d \n", n&(n-1));
        

        这确实有效。因为:

        1010 = 10        111 = 7
        1001 =  9        110 = 6
        ----             ---
        1000 =  8        110 = 6
        

        希望你理解这个想法..

        参考:Turn off the rightmost bit of an integer(阅读)

        或者你可以修改你的代码如下:

        int POS(int n)
        {
            int p=0;
        
            while(!(n&1))
            {
                p++;
                n=n>>1;
            }
        
            return p;
        }
        

        【讨论】:

          【解决方案4】:

          我认为最简单的方法是使用表达式

          n & n - 1
          

          您也可以使用以下简单的方法

          #include <iostream>
          #include <iomanip>
          
          int reset_bit( int x )
          {
              if ( x != 0 )
              {
                  unsigned int n = 1;
                  while ( !( x & n ) ) n <<= 1;
                  x ^= n; 
              }
          
              return x;
          }
          
          int main()
          {
              for ( int x = 1; x < 16; ++x )
              {
                  std::cout << std::hex << x << '\t' << reset_bit( x ) << std::endl;
              }
          
              return 0;
          }
          

          输出是

          3   2
          4   0
          5   4
          6   4
          7   6
          8   0
          9   8
          a   8
          b   a
          c   8
          d   c
          e   c
          f   e
          

          【讨论】:

            猜你喜欢
            • 2021-01-08
            • 2011-06-09
            • 1970-01-01
            • 2021-04-25
            • 2015-10-02
            • 1970-01-01
            • 2016-02-05
            • 1970-01-01
            • 2019-03-31
            相关资源
            最近更新 更多