关闭最右边的整数位

时间:2014-12-18 06:08:33

标签: c++ c bit

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

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;

 }

有最简单的方法吗?

4 个答案:

答案 0 :(得分:2)

阅读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);
} 

答案 1 :(得分:1)

如果您正在讨论清除当前设置的最低有效位使用:

num = num & (num - 1);

这背后的原因是,当您减去一个时,xxxx1000(其中x表示“原始值”)的数字将变为xxxx0111,并且这两个值会给出: / p>

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

清除最右边的一位。


关于偶然机会我误解了这个问题,如果你想把最右边(最不重要)的位设置为零,你只需要:

num = num - (num % 2);

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

要清除位0最不重要的特定位,请使用:

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

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

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

请确保您使用的是无符号整数,可能的行为与预期的签名值无关。

答案 2 :(得分:0)

我认为你正在寻找这个:

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;
}

答案 3 :(得分:-2)

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

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