我需要离开最右边的位置。 我的方法是找到最右边的位置,然后关闭那个位。我写这段代码是为了这么做..
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;
}
有最简单的方法吗?
答案 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